我是程序员的新手,所以请原谅我的新手。所以我正在使用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错误。
有什么理由发生这种情况吗?我错过了什么?谢谢!
答案 0 :(得分:8)
为了澄清您是否查看了HTML源代码的结构,您会看到<div class="brief">
的第一次出现没有子h3
标记(它实际上只有一个子{{1}标签)。
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
,一切都应该没问题。