2013-10-04 51 views
2

我使用引入nokogiri刮了一个网站,看起来像这样:如何使用Nokogiri获得div内的所有内容?

<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”专区内的一切。每个“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 

但它没有返回。请给我一个解释发生了什么事?

回答

3

我认为你应该使用#inner_html方法,而不是#content。虽然你的CSS class 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 node.See里面下面的所有文字:

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. 
4

您错过了一个小点(.)。

没有点,它匹配<BOX>标记。要匹配class="BOX"的元素,您应该用点作为其前缀。

doc.css('.BOX').each do |box| 
    #  ^-- here 
    puts box.content 
end 
+0

这是正确的。 Nokogiri的CSS选择器遵循与正常的HTML CSS选择器相同的规则。 '.foo'表示标签的'CLASS'参数,'#foo'表示标签的'ID'参数。而且,就像在页面中使用普通的CSS一样,CLASS选择器可以返回在DOM中找到的多个标签,而ID选择器将返回第一个。 (具有多个相同的ID标记违反了HTML规范,因此您不应该找到多个标识。) –