2012-03-09 8 views
3

Nokogiriを使用してWebページ上に表示されるテキストを抽出するより良い方法はありますか?現在私はinner_textメソッドを使用していますが、このメソッドは多くのJavaScriptを可視テキストとしてカウントします。キャプチャしたい唯一のテキストは、画面上に表示されるテキストです。例えばNokogiriグラブのみ表示inner_text

は、IRBに私は、Ruby 1.9.2-P290中で次の手順を実行している場合:私は単語を検索する場合、「機能」私は、それがリストに20回現れることがわかりしかし

require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::HTML(open("http://www.bodybuilding.com/store/catalog/new-products.jsp?addFacet=REF_BRAND:BRAND_MET_RX")) 
words = doc.inner_text 
words.scan(/\w+/) 

http://www.bodybuilding.com/store/catalog/new-products.jsp?addFacet=REF_BRAND:BRAND_MET_RXに行くと、 "function"という単語は表示されているテキストのどこにも表示されません。

JavaScriptを無視することはできますか?これを行うにはより良い方法がありますか?

答えて

3

あなたは試みることができる:

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open("http://www.bodybuilding.com/store/catalog/new-products.jsp?addFacet=REF_BRAND:BRAND_MET_RX")) 

doc.traverse{ |x| 
    if x.text? && x.text !~ /^\s*$/ 
     puts x.text 
    end 
} 

私は鋸山であまり行っていないが、私はこれが空白でない文書中/出力のすべてのテキストノードを見つけるべきだと考えています。これは少なくともJavaScriptを無視しているように見え、チェックしたすべてのテキストはページに表示されていました(ただし、ドロップダウンメニューの一部は表示されています)。

+0

恐ろしい!これはもっとうまくいく、感謝! – akaDanPaul

+0

これは動作しますが、制御フローのためのもので、意図した '&&'演算子とは異なる演算順序を持つため、条件付きで' and'を避けるべきです。また、 '〜='の代わりに使用できる '!〜'演算子があります – Ben

1

JavaScriptを無視して、より良い方法があります。あなたはノコギリの力を無視している。ひどく。

直接的な答えを提供するのではなく、ノコギリを使って「魚」を学ぶことができます。文書で

のような:

<html> 
    <body> 
    <p>foo</p> 
    <p>bar</p> 
    </body> 
</html> 

それらは一般の人々にもっと慣れているので、私はCSSのアクセサで始まるをお勧めします:

  • doc = Nokogiri::HTML(var_containing_html)docにHTMLのDOMを解析し、返します。
  • doc.at('p')は、基本的に最初の<p>ノードを指すノードを返します。
  • doc.search('p')は、すべての一致するノードのNodeSetを返します。このノードセットは配列のように動作し、この場合はすべて<p>ノードです。
  • doc.at('p').textは、ノード内のテキストを返します。
  • doc.search('p').map{ |n| n.text }は、<p>ノード内のすべてのテキストをテキスト文字列の配列として返します。

ドキュメントが複雑になるにつれて、ドリルダウンする必要があります。場合によっては、'body p'などのCSSアクセサを使用して行うこともできます。また、XPathを使用する必要があることもあります。私はそれらに入ることはありませんが、そこに大きなチュートリアルと参照があります。

Nokogiri's tutorialsは非常に良好です。あなたが知る必要があるすべてを明らかにするでしょう。

さらに、この種の問題について議論するスタックオーバーフローに関する多くの回答があります。ページの右側にある[関連]リンクを確認してください。

+0

良い答えは、配列へのマップ関数は間違いなく私にとって後で再び便利だろう – abcde123483

+1

この回答はトピックではありません、問題は、全体のページの目に見える内部のテキストを取得することでした。 'body'を使っても、OPは' javascript'タグを取り除くことができません。 – sidney

+0

トピックをオフですか?ほとんど。 OPはNokogiriを正しく使用しておらず、必要なノードを見つけようとするのではなく、すべてのテキストのブランケットグラブをしようとしていて、JavaScriptというテキストで終わってしまった。代わりに、実際に表示されたノードを選択的にチェリーピッキングすることによって、画面上のテキストをガベージなしで抽出することができます。 OPは「これを行うためのより良い方法」を望んでおり、それはこの答えが提供するデータを正しく抽出する方法を理解することにあります。あなたのコメントは、私の主張を証明するだけです。 –