2013-02-07 129 views
0

可能是一個很簡單的問題:紅寶石嵌入了XPath /引入nokogiri

我使用機械化,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 + "]") 

回答

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' 
+0

第一個作品!第二不。謝謝! – abhir

+0

快速澄清的問題 - 爲什麼第一次逃生是在報價之外,第二次是在裏面? '\「#{term} \」' – abhir

+0

這裏使用'back slash'作爲轉義字符。所以你在報價前使用'back slash'。 – codeit

0

一個很少使用的功能,可能是有關你的問題是引入nokogiri的調用能力一個紅寶石回調評估一個XPath表達式。

你可以閱讀更多關於項下的方法文檔http://nokogiri.org此功能Node#xpathhttp://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。