0

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

我正在使用 Mechanize、Nokogori 和 Xpath 来解析一些 html,如下所示:

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

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

term = 'Test'

并将该本地 ruby​​ 变量嵌入到 Xpath 中,如果这有意义的话。

有什么想法吗?

我的直觉是将其视为字符串连接,但这行不通:

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

2 回答 2

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'
于 2013-02-07T03:36:50.770 回答
0

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

您可以在http://nokogiri.orgNode#xpath的( 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。

于 2013-02-10T16:13:48.467 回答