2011-08-22 69 views
5

我是程序员的新手,所以对我的新手很抱歉。所以我正在使用Nokogiri刮擦警察犯罪日志。这是下面的代码:Nokogiri:遇到错误“未定义的方法”文本为零:NilClass“

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = "http://www.sfsu.edu/~upd/crimelog/index.html" 
doc = Nokogiri::HTML(open(url)) 
puts doc.at_css("title").text 
doc.css(".brief").each do |brief| 
puts brief.at_css("h3").text 
end 

我使用的小工具选择书签查找日志的CSS选择器(瑞丰)。当我通过brief.at_css传递“h3”时,我得到了里面所有带有内容的h3标签。

但是,如果我添加.text方法来删除标记,我会得到NoM​​ethod错误。

是否有任何理由,这是怎么回事?我错过了什么?谢谢!

回答

8

要澄清,如果您查看HTML源代码的结构,您将看到<div class="brief">的第一个匹配项没有子项h3标签(它实际上只有一个子标签<p>)。

Nokogiri Docs

at_css(*规则)

搜索这个节点的CSS规则的第一次出现。相当于css(规则).first请参阅节点#css以获取更多信息。

如果您致电at_css(*rules)该文档声明它相当于css(rules).first。当有物品(你.brief类包含一个h3),那么将Nokogiri::XML::Element对象返回这是为了响应text,而如果你的.brief不包含h3然后NilClass对象返回,这当然并不text

回应

因此,如果我们称之为css(rules)(因为你还没有at_css)我们得到了Nokogiri::XML::NodeSet对象中返回,其中有定义为text()方法(注意alias

# Get the inner text of all contained Node objects 
    def inner_text 
    collect{|j| j.inner_text}.join('') 
    end 
    alias :text :inner_text 

,因为班级是Enumerable它遍历它的孩子调用它们的inner_text方法并将它们连接在一起。

因此您可以执行nil?检查或@floatless正确地指出仅仅使用css方法

+0

真棒,做到了!非常感谢! – aboutaaron

4

你只需要用css代替at_css,一切都应该没问题。

+0

除了'css'返回一个节点集,其中'at_css'返回一个节点,所以节点集将需要迭代。 –

+0

除了您也可以在NodeSet上调用#inner_text。是否它会做你想要的取决于你想要发生什么,当有> 1匹配。如果总是只有0或1,它可能会做你想要的。 – jrochkind

相关问题