可能是一个非常简单的问题:
我正在使用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 + "]")
答案 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#xpath
(http://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。