我从页面中提取Nokogiri::XML::NodeSet
,结果如下:
<a href="http://www.goldsteinpatentlaw.com" target="_blank" title="Goldstein Patent Law ( U.S.A. )">
<img src="http://www.asdf.com/LBM_Images/Offices//law-firm-goldstein-patent-law-photo-1258381.jpg" height="62" width="100" alt="Goldstein Patent Law (U.S.A.)">
</a>
我无法弄清楚如何将那个(显而易见的人类)<a>
标签变成一个Mechanize / Nokogiri解析的对象,这样我就可以轻松地从链接中检索信息。
Nokogiri / Mechanize文档确实令人困惑,因为我从来不知道该看哪个。不知道哪个先出现,哪个用哪个等等。对于简单的抓取和放大,似乎非常复杂。解析我正在尝试。
答案 0 :(得分:2)
NodeSet就像一个数组。如果你在NodeSet上使用puts(),那么就像你在一个数组上使用puts一样,ruby会在一个单独的行上输出NodeSet中每个项目的字符串表示。 NodeSet可以包含各种对象,但通常它们将包含名为<Nokogiri::XML::Element>
的对象,它们代表html中的标记。
从您的输出中可以明显看出,您的Nodeset只有一个项目,您看到的是该项目的字符串表示形式。这是一个例子:
require 'nokogiri'
str = "<div>hello</div><div>world</div>"
html_doc = Nokogiri::HTML(str)
divs = html_doc.xpath("//div")
divs.each do |div|
p div
end
puts '*' * 10
puts divs
--output:--
#<Nokogiri::XML::Element:0x80836ec4 name="div" children=[#<Nokogiri::XML::Text:0x80836a00 "hello">]>
#<Nokogiri::XML::Element:0x80836668 name="div" children=[#<Nokogiri::XML::Text:0x80836064 "world">]>
**********
<div>hello</div>
<div>world</div>
所以你只需要检索NodeSet的第一个元素,就像检索数组中的第一个元素一样:
p divs[0]
或者,如果您知道NodeSet中只有一个元素,那么您可以使用:
div = html_doc.at_xpath("//div")
而不是返回NodeSet只返回匹配xpath的第一个元素。
当您真的想知道自己得到了什么时,应该使用p
代替puts
。
答案 1 :(得分:1)
这就是你要找的东西吗?
require 'nokogiri'
str = '<a href="http://www.goldsteinpatentlaw.com" target="_blank" title="Goldstein Patent Law ( U.S.A. )">
<img src="http://www.asdf.com/LBM_Images/Offices//law-firm-goldstein-patent-law-photo-1258381.jpg" height="62" width="100" alt="Goldstein Patent Law (U.S.A.)">
</a>'
doc = Nokogiri::HTML(str)
link = doc.at('a')
#=> #<Nokogiri::XML::Element:0x1744488 name="a" attributes=[
#<Nokogiri::XML::Attr:0x174444c name="href" value="http://www.goldsteinpatentlaw.com">,
#<Nokogiri::XML::Attr:0x1744440 name="target" value="_blank">,
#<Nokogiri::XML::Attr:0x1744434 name="title" value="Goldstein Patent Law ( U.S.A. )">] children=[#<Nokogiri::XML::Text:0x1743d20 "\n ">,
#<Nokogiri::XML::Element:0x1743c9c name="img" attributes=[#<Nokogiri::XML::Attr:0x1743c60 name="src" value="http://www.asdf.com/LBM_Images/Offices//law-firm-goldstein-patent-law-photo-1258381.jpg">,
#<Nokogiri::XML::Attr:0x1743c54 name="height" value="62">, #<Nokogiri::XML::Attr:0x1743c48 name="width" value="100">,
#<Nokogiri::XML::Attr:0x1743c3c name="alt" value="Goldstein Patent Law (U.S.A.)">]>,
#<Nokogiri::XML::Text:0x17433d8 "\n">]>
您可以使用at
,at_css
或at_xpath
选择器来获取您想要的内容,然后执行以下操作
link.attributes["href"].value
#=> "http://www.goldsteinpatentlaw.com"
link.attributes["title"].value
#=> "Goldstein Patent Law ( U.S.A. )"
答案 2 :(得分:1)
也许有点晚了,但有关NodeSets的更多内容,请看这里:http://www.rubydoc.info/gems/nokogiri/Nokogiri/XML/NodeSet#attr-instance_method
根据他们的文档,这是我用来做你想做的事情的代码,它有效!
result.search("h2 > a").attr("href")