2

open-uri + hpricot を使用して Web ページを解析しようとしていますが、宝石が欲しいものをもたらさないため、解析プロセスに問題があるようです。

具体的には、このdiv (ID は'pasajes' ) をこの URLで取得したい:

http://www.despegar.com.ar

私はこのコードを書きます:

require 'nokogiri'
require 'hpricot'
require 'open-uri'

document = Hpricot(open('http://www.despegar.com.ar/')) # WITH HPRICOT
document2 = Nokogiri::HTML(open('http://www.despegar.com.ar/')) # WITH NOKOGIRI

pasajes = document.search("//div[@id='pasajes']")
pasajes2 = document2.xpath("//div[@id='pasajes']")

しかし、それは何ももたらしません!hpricot と nokogiri の両方で多くのことを試しました。

  1. そのdivへの絶対パスを指定してみます
  2. セレクターで CSS パスを試す
  3. hpricot 検索ショートカット (doc//"div#pasajes") で試してみます
  4. 「pasajes」divに到達するためのほぼすべての可能な相対パス

最後に、恐ろしい解決策を見つけました。私はwatirライブラリを使用し、Webブラウザを開いた後、htmlをhpricotに渡しました。このようにして、hpricot は 'pasajes' div を認識します。しかし、解析目的のためだけに Web ブラウザを開きたくありません...

私が間違っていることは何ですか?オープンウリの効きが悪い?プリコットですか?

4

4 に答える 4

4

静的 HTML ページには、id pasajes の DIV はありません。*nix を実行している場合は、次のようにして確認できます。

curl http://www.despegar.com.ar/ | grep pasajes

私の推測では、これは JavaScript によって生成されたものです。

MacRuby を使用している場合は、Lyndonを試すことができます。

于 2009-08-31T14:40:29.983 に答える
1

Nokogiri でも同様の問題が発生しましたが、OS X 10.5 で発生しました。ただし、最初に open-uri を試して、HTML div がたくさんある問題のページを開こうとしました。私は使用して見つけました:

urldoc = open('http://hivelogic.com/articles/using_usr_local')
urldoc.readlines{|line| puts line}

すばらしい HTML がたくさん表示されます。また、「ファイル」を文字列に読み取り、それを Nokogiri に渡すことで、正常に動作することもわかりました。ノコギリについて教えるために、彼らが ruby​​forge で使用しているデモそのものを修正する必要さえありました。

独自の例を使用すると、次のようになります。

>> doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))
=> <!DOCTYPE html>

>> doc.children
=> 

うん!

URLを文字列に読み込むように微調整すると、良いものが得られます。

>> doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove').read)
=> <!DOCTYPE html>
<html>
<head>
..... TONS OF HTML HERE ........
</div>
</body>
</html>

irb を使用してプレイすると、次の素敵な警告が表示されることに注意してください。

こんにちは。libxml2 バージョン 2.6.16 を使用していますが、これは 4 年以上前のもので、多くのバグがあります。HTML/XML 解析を最大限に楽しむために、libxml2 のバージョンをアップグレードし、nokogiri を再インストールすることをお勧めします。libxml2 バージョン 2.6.16 を使用したいが、この警告が気に入らない場合は、nokogiri を要求する前に定数 I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2 を定義してください。

しかし、私は恐怖やさまざまな専門家に対処する気分ではありませんが、/usr/local 何とか何とかで libxml を修正するという矛盾したアドバイスです。リンクテキストの投稿にはそれについての優れた説明がありますが、別の* nixウィザードは、いくつかの健全な警告と懸念で概念そのものを攻撃します. だから私は「仕方ない」と言います。

なぜ私はこれを書くのですか?IMO なので、ノコギリ ブルーと libxml 警告の間にリンクがあると思います。OS X 10.5 は古いものであり、問​​題がある可能性があります。

質問

他の OS X 10.5 ユーザーで Nokogiri でこの問題が発生していますか?

于 2009-10-10T18:41:38.660 に答える
1

これは、それ自体の回答ではなく、上記のジョナスの回答に対する追加のコメントとしてより適切です...しかし、私はSOに不慣れで、まだ「コメント権限」を持っていません:)

Selenium RC を使用して完全な HTML をダウンロードし、ダウンロードしたファイルに対して nokogiri を使用できます。これは、コンテンツが Javascript によって生成/変更されている場合にのみ機能することに注意してください。ウェブページがコンテンツを設定するために Cookie に依存している場合、オプションは Selenium (ブラウザ内) または、ご指摘のように watir になります。

これに対するより良い解決策を聞きたいです(nokogiriでWebページを解析したいのですが、ページはJSによって変更されています)。

于 2009-09-03T07:04:48.470 に答える