open-uri + hpricot & nokogiri が HTML を正しく解析しない
質問
open-uri + hpricot を使用して Web ページを解析しようとしていますが、gem が必要なものをもたらさないため、解析プロセスに問題があるようです。
具体的にはこれを手に入れたい ディビジョン (IDは誰ですか 「パサヘス」) この URL:
このコードを書きます:
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 の両方で多くのことを試しました。
- その div への絶対パスを与えてみます
- セレクターを使用してCSSパスを試してみます
- hpricot検索ショートカット(doc//"div#pasajes")を試してみます
- 「pasajes」div に到達するためのほぼすべての可能な相対パス
最後に私は恐ろしい解決策を見つけました。私は watir ライブラリを使用し、Web ブラウザを開いた後、html を hpricot に渡しました。このようにして、hpricot は「pasajes」div を認識します。しかし、解析目的のためだけに Web ブラウザを開きたくありません...
私の何が間違っているのでしょうか?open-uriの動作が悪いのでしょうか?ヘリコットですか?
解決
静的なHTMLページのid pasajesとはDIVはありません。あなたは* nixのを実行している場合は、実行してそれを見ることができます:
curl http://www.despegar.com.ar/ | grep pasajes
私の推測では、それがJavaScriptに生成されたということです。
あなたはMacRubyのを使用している場合は、あなたはリンドンを試みることができる。
他のヒント
そのページのid「pasajes」とはdivがありません。これは問題です。
この自体が答えではなく、上記のヨナスの回答に追加コメントとして、よりに合った...しかし、私はSOに新しいですし、まだ 『コメント力』を持っていません。)
あなたは完全なHTMLをダウンロードし、ダウンロードしたファイルを鋸山使用するセレンRCを使用することができます。コンテンツはJavaScriptによって変更/生成されている場合にのみ動作することに注意してください。 Webページをセットアップするためにクッキーに依存する場合、あなたが指摘しているように、コンテンツのオプションは、(ブラウザで)セレンまたはワチールになります。
私はこれまでよりよい解決策を聞くのが大好きだ(鋸山でWebページを解析したいのですが、ページはJSによって変更されます)。
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 に渡すことで、正常に動作することがわかりました。Nokogiri について説明するために、Rubyforge で使用されているデモ自体を変更する必要さえありました。
彼ら自身の例を使用すると、次のようになります。
>> 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 を使用してプレイすると、次のような素敵な警告が表示されます。
こんにちは。4年以上前のLibxml2バージョン2.6.16を使用しており、バグがたくさんあります。最大のHTML/XML解析の喜びのために、LibXML2のバージョンをアップグレードし、Nokogiriを再インストールすることをお勧めします。libxml2バージョン2.6.16を使用するのが好きで、この警告が気に入らない場合は、nokogiriを再Quaringする前に、定数i_know_i_am_using_an_old_and_buggy_version_of_libxml2を定義してください。
しかし、私は恐ろしい話や、/usr/local の libxml を修正するためのさまざまな専門家による矛盾したアドバイスに対処する気分ではありません。に関する投稿 リンクテキスト にはそれについての素晴らしい説明がありますが、別の *nix ウィザードがいくつかの健全な警告と懸念を示してその概念そのものを攻撃します。だから私は「そんなことはない」と言います。
なぜこれを書くのか?なぜなら、私の鋸霧ブルースと libxml 警告の間には関連性があるかもしれないと私は思うからです。OS X 10.5 は古いものなので、問題が発生する可能性があります。
質問
他の OS X 10.5 ユーザーで Nokogiri に関してこの問題が発生している人はいますか?