我是一个程序员新手,所以请原谅我的新手。所以我在用诺科吉里抓取警方的犯罪记录。下面是代码:
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
,一切都应该没问题。