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]、テストが引用符で囲まれていない場合です。したがって、文字列を引用符で囲むには、エスケープ文字を使用する必要があります\

   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

あなたの質問に関連するかもしれない少し使用された機能は、XPath式を評価している間にrubyコールバックを呼び出すNokogiriの機能です。

この機能の詳細については、 http: //nokogiri.orgのメソッドドキュメント(http://nokogiri.org/Nokogiri/XML/Node.html#method-i-xpath)を参照してください。質問:Node#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 に答える