2

hpricot を使用してテーブル ベースの Web サイトから情報を抽出しようとしています。FireBug で XPath を取得します。

/html/body/div/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td[2]/table/tbody/tr[3]/td/table[3]/tbody/tr

これは機能しません... どうやら、FireBug の XPath はレンダリングされた HTML のパスであり、サイトからの実際の HTML ではありません。tbody を削除すると問題が解決する可能性があることを読みました。

私は試してみます:

/html/body/div/table/tr/td/table/tr[2]/td/table/tr/td[2]/table/tr[3]/td/table[3]/tr

それでもうまくいきません...もう少し調査を行ったところ、XPathで数値が削除されたと報告している人もいるので、次のようにします。

/html/body/div/table/tr/td/table/tr/td/table/tr/td/table/tr/td/table/tr

まだ運がない...

したがって、次のように段階的に実行することにしました。

(doc/"html/body/div/table/tr").each do |aaa |
  (aaa/"td").each do | bbb|
        pp bbb
        (bbb/"table/tr").each do | ccc|
            pp ccc 
      end
  end
end

必要な情報は bbb にありますが、ccc にはありません。

私は何を間違っていますか、または長い/複雑なXPathでHTMLをスクラップするためのより良いツールがあります.

4

5 に答える 5

1

NokogiriはHpricotと同じAPIを使用しますが、XPath式もサポートしていることは注目に値します。

于 2009-05-11T05:21:50.797 に答える
1

XPath の代わりに hpricot の CSS 解析を使用した方がよいでしょう。_why は、ある時点で XPath の価値を下げる可能性について話していました。

データのより良い例はありますか? 簡単に参照できる CSS タグを使用していますか?

次のように検索する方がはるかに簡単です。

doc.search("#id_tag > table > tr.class_tag > td").each do |aaa|
    aaa.search("blah > blah").each do |bbb|
        bbb.inner_html

hpricot について議論していた _why の Web サイト (今は見つけられないようです) に古いページがあり、いくつかのコメントは、あなたがしているものと同様のネストされた検索を行うときに、XPath よりも CSS バージョンの方が優れていることをほのめかしていました。 .

より良い答えが得られればいいのですが、XPath で髪の毛を引き裂く前に、CSS メソッドを試してみて、それがどうなるかを確認することを真剣にお勧めします。

于 2009-04-10T06:43:09.350 に答える
0

HTML コードに TBODY タグがありません。Firebug はそれを自動的に生成します。

于 2010-08-22T00:43:44.117 に答える