野木:遇到错误"undefined method ‘text’ for nil: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

我使用选择器小工具bookmarklet来查找日志(.brief)的CSS选择器。当我把"h3"通过简报时。我得到了所有的h3标签和里面的内容。

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

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

为了澄清,如果您查看HTML源的结构,您将看到<div class="brief">的第一次出现没有子h3标记(它实际上只有子<p>标记)。

Nokogiri Docs说

at_css(*规则)

在该节点中搜索首次出现的CSS规则。相当于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方法

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

相关内容

  • 没有找到相关文章

最新更新