Nokogiri:遇到错误“未定义的方法'文本'为nil:NilClass”

时间:2011-08-22 21:49:27

标签: ruby nokogiri

我是程序员的新手,所以请原谅我的新手。所以我正在使用Nokogiri来搜查警方的犯罪记录。以下是代码:

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)。当我通过brief.at_css传递“h3”时,我得到了所有内容为h3的标签。

但是,如果我添加.text方法来删除标签,我会收到NoMethod错误。

有什么理由发生这种情况吗?我错过了什么?谢谢!

2 个答案:

答案 0 :(得分:8)

为了澄清您是否查看了HTML源代码的结构,您会看到<div class="brief">的第一次出现没有子h3标记(它实际上只有一个子{{1}标签)。

Nokogiri Docs

  

at_css(*规则)

     

在此节点中搜索第一次出现的CSS规则。相当于css(规则)。首先参见Node#css了解更多信息。

如果您致电<p>文档说明它等同于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 1}})

# 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方法

答案 1 :(得分:4)

您只需将at_css替换为css,一切都应该没问题。