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
在 OSX 10.10 Yosemite 上安装 Nokogiri