3

Nokogiri を使用して、次のようなサイトをスクレイピングしています。

<div class="BOX">
  <div class="apple">This is an apple.</div>
  <p>Apple a day, doctor away</p>
</div>

<div class="BOX">
  <div class="iphone">This is an iPhone.</div>
  <div class="android">This is an Android.</div>
  <a href="www.apple.com">Apple home page</a>
  <p>Snoop Lion has both. He's rich.</p>
</div>

「BOX」div内のすべてをスクレイピングしたいと思います。各「BOX」には独自の div と HTML タグがあり、明らかなパターンはありません。どうすればいいですか?

私の最初の試みは次のようになりました:

require 'uri-open'
require 'nokogiri'

doc = Nokogiri::HTML(open('http://www.examplesite.com'))
doc.css('BOX').each do |box|
  puts box.content
end

しかし、それは何も返しません。何が起こっているのか説明をお願いできますか?

4

2 に答える 2

5

#inner_htmlの代わりにメソッドを使用する必要があると思います#content。あなたのCSSclass selectorルールは間違っていますが。コードは次のようになります。

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse <<-eot
<div class="BOX">
  <div class="apple">This is an apple.</div>
  <p>Apple a day, doctor away</p>
</div>

<div class="BOX">
  <div class="iphone">This is an iPhone.</div>
  <div class="android">This is an Android.</div>
  <a href="www.apple.com">Apple home page</a>
  <p>Snoop Lion has both. Hes rich.</p>
</div>
eot

doc.css('.BOX').each do|n|
   p n.inner_html
end

出力:

  <div class="apple">This is an apple.</div>
  <p>Apple a day, doctor away</p>

  <div class="iphone">This is an iPhone.</div>
  <div class="android">This is an Android.</div>
  <a href="www.apple.com">Apple home page</a>
  <p>Snoop Lion has both. He's rich.</p>

#content各ノード内のhtmlラッパーを削除することにより、すべてのテキストが表示されdivます。以下を参照してください。

doc.css('.BOX').each do|n|
   puts n.content
end

出力:

  This is an apple.
  Apple a day, doctor away

  This is an iPhone.
  This is an Android.
  Apple home page
  Snoop Lion has both. He's rich.
于 2013-10-04T15:29:09.403 に答える
4

ドット ( .) が抜けています。

ドットがない場合は、<BOX>タグに一致します。要素を一致させるclass="BOX"には、先頭にドットを付ける必要があります。

doc.css('.BOX').each do |box|
  #      ^-- here
  puts box.content
end
于 2013-10-04T15:26:07.087 に答える