2010-12-30 10 views
1

私は、反復的なループを使用して、ウェブサイトからの半構造化されたHTMLドキュメントと半均一なHTML DOMドキュメントをまたいで動作するDOM要素の復元と位置特定に使用しています。HTML DOM文書の要素を検索するためのトップダウンまたはボトムアップのアプローチですか?

たとえば、ウェブサイト上のリンクをクロールして、その中の小さな変化をxpathの場所に渡すとき。柔軟性のある途切れのないクロールを可能にするためには、復元力が求められます。

1)私は(例:メニューのフッターなどをヘッダー)

2)それはそれ以来区別できるのです が残り 区別 ページの特定の領域に配置されているリンクをしたいことを知っています はテーブルの内側にあり、 のパルグラフまたはコンテナです。

3)1)に言及した。この目的のリンクの前に予期しない親や子ども の許容レベル が存在することができますが、私は何を知りません。 の予期しない要素は、 から出発する1)を意味します。

4)要素のIDと クラスまたはその他の一意の属性 の値を使用して識別することは望ましくありません。

私は、次のXPathを総括すべきだと思う:一部のページで

/`/p/table/tr/td/a` 

は、XPathにバリエーションがあるが、それはまだ希望)1として、リンクを修飾

//p/div/table/tr/td/aまたは//p/div/span/span/table/tr/td/b/a

私は各ループ反復を模倣するためにインデントを使用しました(

私はplurralかsingularを使うべきですか?子供対子供。両親対両親。私は単なる親や子がここで心配しているので、単数形が理にかなっていると思う。 SEARCHING

TOP DOWN:

how many p's are there ? 
how many these p's have table as child ? If none, search next sub level. 
    how many these table's have tr as child ? If none, search next sub level. 
    how many these tr have td as child ? If none, search next sub level. 
     how many these td have a as child ? 

BOTTOM UPはを検索:それはトップダウンかボトムアップかどう

how many a's are there ? 
how many of these a's have td as parent ? If none, look up to the next super level. 
    how many of these td have tr as parent ? If none, look up to the next super level. 
    how many of these tr have table as parent ? If none, look up to the next super level. 
    how many of these table have p as a parent ? If none, look up to the next super level. 

はそれが重要ですか?私はトップダウンが役に立たず、ループの最後までに回ってしまうと非効率であると感じています。希望のアンカーリンクは見つかりません。

ループの各反復で予期しない親または子供がどれくらい発見されたかを測定し、私が快適であるプリセット定数と比較すると思います。私の望むアンカーリンクが発見される前に予期しない親や子の反復があったら、それは私が探しているものではないと思います。

これは正しい方法ですか?これは、私が頭の上で思いついたものです。この問題が明確でない場合はお詫び申し上げます。私は最善を尽くしました。私はこのアルゴリズムについていくつかの情報を得たいと思っています。あなたがパス内の中間要素の数の制限を持っている場合は、2以上ではないと言う、その後、上記に変更される

//p//table//a 

+0

私は実際にこの質問を理解していませんが、パフォーマンスに関しては、ストリーミング(SAXのような)が行く方法だと言います。「p」マークが見つかると、「a」状態を検索します。 –

+0

質問は、基本的に、その場所の小さな変化に弾力性のあるhtml要素の配置です。たとえば、ユーザーにはブラウザで表示される要素を表すxpathはxpathの小さな変化を認識しません。しかし、スパイダーにとって、xpathのわずかな変化はまったく新しい要素として解釈されます。私はストリーミングやSA​​Xの意味を理解していません。 '** p ** marが見つかりました** ** a ** state'の検索であなたが意味することを明確にすることができますか?あなたは検索pを意味し、その中のアンカーを検索しますか? – heysup

+0

良い質問、+1。要件を満たす 'a'要素を厳密に選択する単一のXPath式については、私の答えを参照してください。 :) –

答えて

0

あなたはような何かをしたいようです

//p[not(ancestor::*[3])] 
     //table[ancestor::*[1][self::p] or ancestor::*[2][self::p]] 
       /tr/td//a[ancestor::*[1][self::td] or ancestor::*[2][self::td]] 

これは、その親である、その親またはグランド親tdすべてa要素を選択します親の祖父母がtableであり、その親または祖父母がpであり、ancesstor要素が3つ未満である。

関連する問題