2016-05-31 6 views
2

Nokogiriでhttp://www.pro-medic.ru/index.php?ht=246&perpage=allを解析しようとしていますが、残念ながらページからすべての項目を取得できません。Nokogiriで大きなHTMLファイルを解析する

私の簡単なテストコードは次のとおりです。

require 'open-uri' 
require 'nokogiri' 

html = Nokogiri::HTML open('http://www.pro-medic.ru/index.php?ht=246&perpage=all') 
p html.css('ul.products-grid-compact li .goods_container').count 

それだけで83項目を返しますが、実際の数は、およそ186

私は問題はopenにすることができると思ったが、それは、その関数が読み込みらしいですHTMLページが正しく表示されます。

誰も同じ問題に直面しましたか?

答えて

3

ファイルがNokogiriのパーサーの制限を超えているようです。 |=は、ビットごとのOR代入演算子あること

require 'open-uri' 
require 'nokogiri' 

url = 'http://www.pro-medic.ru/index.php?ht=246&perpage=all' 
html = Nokogiri::HTML(open(url)) do |config| 
    config.options |= Nokogiri::XML::ParseOptions::HUGE 
end 
html.css('ul.products-grid-compact li .goods_container').count 
#=> 186 

は注意、Parse Optionsによると、論理演算子と||=

それを混同しないでください、あなたも設定することができます:あなたはHUGEフラグを追加することによって、制限を緩和することができますこの旗はconfig.huge

+0

ステファンありがとうございました!私は、ページサイズについていくつかの制約があるはずです。しかし、 'html.css( 'ul.products-grid-compact li .goods_container')。countは計算に時間がかかりすぎるようになりました。それをスピードアップする方法はありますか?それとも、ページサイズが大きいだけなので、それとは関係がありません。 – Aleksey

+0

クイックチェックは、マークアップが壊れていることを示します。その結果、571の深さのノードツリーが生成され、そのようなツリーは非常に長い時間がかかります。あなたはNokogiriにそれを供給する前にページを消毒する必要があります。私はSafariを使ってページの固定版を保存しましたが、構成を変更することなく要素を数えるのにわずか0.5秒しかかかりませんでした。 – Stefan

+0

Stefanはマークアップを確認する方法を教えていただけますか?自動的にコードから実行する方法はありますか? – Aleksey

関連する問題