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

abo*_*ron 5 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
Run Code Online (Sandbox Code Playgroud)

我使用选择器小工具书签来查找日志的CSS选择器(.brief).当我通过brief.at_css传递"h3"时,我得到所有内容中的h3标签.

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

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

Pau*_*l.s 8

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

引入nokogiri文件说,

at_css(*规则)

在此节点中搜索第一次出现的CSS规则.相当于css(规则).first有关详细信息,请参阅Node#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
Run Code Online (Sandbox Code Playgroud)

因为类是Enumerable迭代它的孩子调用他们的inner_text方法并将它们连接在一起.

因此,您可以执行nil?检查或正确声明@floatless只使用该css方法