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

Posted

技术标签:

【中文标题】Nokogiri:遇到错误“nil:NilClass 的未定义方法‘文本’”【英文标题】:Nokogiri: Running into error "undefined method ‘text’ for nil:NilClass" 【发布时间】:2011-08-22 21:49:26 【问题描述】:

我是程序员的新手,所以请原谅我的新手。所以我正在使用 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 错误。

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

【问题讨论】:

【参考方案1】:

如果您查看 HTML 源代码的结构,您会发现第一次出现的 <div class="brief"> 没有子 h3 标记(它实际上只有一个子 <p> 标记)。

Nokogiri Docs 这么说

at_css(*rules)

在此节点中搜索第一次出现的 CSS 规则。等价于 css(rules).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

因为这个类是Enumerable,它会遍历它的孩子调用他们的inner_text 方法并将它们连接在一起。

因此,您可以执行nil? 检查,也可以按照@floatless 的正确说明使用css 方法

【讨论】:

太棒了!非常感谢!【参考方案2】:

您只需将at_css 替换为css 就可以了。

【讨论】:

除了css返回一个NodeSet,而at_css返回一个Node,所以需要对NodeSet进行迭代。 除了你也可以在 NodeSet 上调用 #inner_text。它是否会做你想做的事情取决于当有> 1个匹配时你想要发生什么。如果总是只有 0 或 1,它可能会做你想做的事。

以上是关于Nokogiri:遇到错误“nil:NilClass 的未定义方法‘文本’”的主要内容,如果未能解决你的问题,请参考以下文章

ruby nokogiri gem install mac osx high sierra

Nokogiri 安装失败 -libxml2 丢失

在 OSX 10.10 Yosemite 上安装 Nokogiri

如何在 Mac OS Sierra 10.12 上安装 Nokogiri

安装 nokogiri (1.5.2) 时出错

使用 Nokogiri 的 XML Builder 添加命名空间