将Ruby嵌入xpath / Nokogiri中

时间:2013-02-07 03:34:14

标签: ruby xpath nokogiri mechanize

可能是一个非常简单的问题:

我正在使用Mechanize,Nokogori和Xpath解析一些html:

category = a.page.at("//li//a[text()='Test']")

现在,我希望我在text()=中搜索的术语是动态的...即。我想创建一个局部变量:

term = 'Test'

并在Xpath中嵌入了本地ruby变量,如果这有意义的话。

任何想法如何?

我的直觉是将其视为字符串连接,但这并不成功:

term = 'Test'
category = a.page.at("//li//a[text()=" + term + "]")

2 个答案:

答案 0 :(得分:3)

使用category = a.page.at("//li//a[text()=" + term + "]")时。方法的最终结果是//li//a[text()=Test],其中test不在引号中。因此,要在字符串周围加上引号,您需要使用转义字符\

   term = 'Test'
   category = a.page.at("//li//a[text()=\"#{term}\"]")

   category = a.page.at("//li//a[text()='" + term + "']")

   category = a.page.at("//li//a[text()='#{term}']")

例如:

>> a="In quotes" #=> "In quotes"

>> puts "This string is \"#{a}\""  #=> This string is "In quotes"
>> puts "This string is '#{a}'"    #=> This string is 'In quotes'
>> puts "This string is '"+a+"'"   #=> This string is 'In quotes'

答案 1 :(得分:0)

可能与您的问题相关的一个很少使用的功能是Nokogiri在评估XPath表达式时调用ruby回调的能力。

您可以在Node#xpathhttp://nokogiri.org)的方法文档下的http://nokogiri.org/Nokogiri/XML/Node.html#method-i-xpath处详细了解此功能,但这里有一个解决您问题的示例:

#! /usr/bin/env ruby

require 'nokogiri'

xml = <<-EOXML
<root>
  <a n='1'>foo</a>
  <a n='2'>bar</a>
  <a n='3'>baz</a>
</root>
EOXML
doc = Nokogiri::XML xml

dynamic_query = Class.new do
  def text_matching node_set, string
    node_set.select { |node| node.inner_text == string }
  end
end

puts doc.at_xpath("//a[text_matching(., 'bar')]", dynamic_query.new)
# => <a n="2">bar</a>
puts doc.at_xpath("//a[text_matching(., 'foo')]", dynamic_query.new)
# => <a n="1">foo</a>

HTH。