为什么我的 Nokogiri 选择器不工作?
Why my Nokogiri selector not working?
这是我第一次尝试使用 Nokogiri,但它不起作用,我不明白为什么:
这是XML:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
</catalog>
我正在使用此代码:
require 'nokogiri'
f = File.open("test.xml")
doc = Nokogiri::XML(f)
nodes = doc.xpath("title")
nodes.each do |node|
print node.text
end
我得到的节点为零 class。
到 select 个匹配 select 的节点或尝试:
nodes = doc.xpath("//title")
我会这样写代码:
require 'nokogiri'
doc = Nokogiri::XML(File.read("test.xml"))
nodes = doc.search("title")
puts nodes.map(&:text)
回到问题。您使用了:
nodes = doc.xpath("title")
这会强制 Nokogiri 将您的选择器解释为 XPath,并且会寻找名为 <title>
的 <catalog>
的直接祖先。那是不存在的。相反,如果您想在整个文档中搜索任何 <title>
标签,则需要使用 //title
。
或者,如果您使用 search
而不是强制 xpath
,Nokogiri 会决定您的意思是使用 CSS 选择器 title
,它会正常工作,因为在 CSS 中,title
会搜索整个文档。
我建议使用 CSS 而不是 XPath,因为它更具可读性。 XPath 非常强大,但随着选择器变得更加强大,它也会很快收集到大量视觉噪音。
这是我第一次尝试使用 Nokogiri,但它不起作用,我不明白为什么:
这是XML:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
</catalog>
我正在使用此代码:
require 'nokogiri'
f = File.open("test.xml")
doc = Nokogiri::XML(f)
nodes = doc.xpath("title")
nodes.each do |node|
print node.text
end
我得到的节点为零 class。
到 select 个匹配 select 的节点或尝试:
nodes = doc.xpath("//title")
我会这样写代码:
require 'nokogiri'
doc = Nokogiri::XML(File.read("test.xml"))
nodes = doc.search("title")
puts nodes.map(&:text)
回到问题。您使用了:
nodes = doc.xpath("title")
这会强制 Nokogiri 将您的选择器解释为 XPath,并且会寻找名为 <title>
的 <catalog>
的直接祖先。那是不存在的。相反,如果您想在整个文档中搜索任何 <title>
标签,则需要使用 //title
。
或者,如果您使用 search
而不是强制 xpath
,Nokogiri 会决定您的意思是使用 CSS 选择器 title
,它会正常工作,因为在 CSS 中,title
会搜索整个文档。
我建议使用 CSS 而不是 XPath,因为它更具可读性。 XPath 非常强大,但随着选择器变得更加强大,它也会很快收集到大量视觉噪音。