为什么我的Nokogiri选择器不工作?

时间:2016-10-15 15:10:56

标签: ruby nokogiri

这是我第一次尝试使用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

我将节点作为零类。

2 个答案:

答案 0 :(得分:1)

要选择与选择器匹配的节点,请尝试:

nodes = doc.xpath("//title")

答案 1 :(得分:0)

我写的代码如下:

require 'nokogiri'

doc = Nokogiri::XML(File.read("test.xml"))
nodes = doc.search("title")
puts nodes.map(&:text)

回到问题所在。你用过:

nodes = doc.xpath("title")

迫使Nokogiri将您的选择器解释为XPath,并将寻找名为<catalog>的{​​{1}}的直接祖先。那不存在。相反,如果您想在整个文档中搜索任何<title>代码,则需要使用//title

或者,如果您使用<title>而不是强制xpath,Nokogiri会决定您使用CSS选择器search并且它可以正常工作因为,在CSS中,title会搜索整个文档。

我建议在XPath上使用CSS,因为它更具可读性。 XPath非常强大,但随着选择器变得更强大,它也会迅速收集大量的视觉噪音。