2013-08-29 57 views
1

MySQL列(product_path)的值爲//*[(@id=\"scroller\")]/li/*/a。使用它與Nokogiri投擲Nokogiri::XML::XPath::SyntaxError: Invalid expression:什麼是錯的。如何在MySQL中存儲Nokogiri xpath

require 'mysql2' 
require 'active_record' 

ActiveRecord::Base.establish_connection( 
    :adapter => "mysql2", 
    :host => "localhost", 
    ... 
) 

class MyTable < ActiveRecord::Base 
end 

@s = MyTable.first 

#...Looks like backward slash is escaped automatically by mysql 
@s.product_path #=> "//*[(@id=\\\"scroller\\\")]/li/*/a" 

p = Nokogiri::HTML(open(@s.url)) 

#all variations below throw invalid expression error 
p.search(@s.product_path).count 
p.search("#{@s.product_path").count 
p.xpath(@s.product_path).count 

#But this works flawlessly. 
p.search("//*[(@id=\"scroller\")]/li/*/a").count #=> works fine. 

更新

我想這和它的工作。

a = '//*[(@id="scroller")]/li/*/a' 
p.search(a).count 

額外的反斜槓似乎造成了問題。我如何擺脫它們?

+0

'puts''product_path'查看它是什麼,'inspect'會跳過嵌入的引號和反斜槓,只是混淆了你。在您將它放入數據庫之前,'product_path'看起來像什麼?它從何而來?爲什麼在不使用插值並嵌入雙引號的字符串周圍使用雙引號? –

+0

'product_path'由我手動輸入。 – Bala

+0

但它是如何進入的?你輸入時看起來像什麼? –

回答

1

你進入XPath表達式爲:

//*[(@id=\"scroller\")]/li/*/a 

注意轉義雙引號。然後你得到這個紅寶石字符串:

"//*[(@id=\\\"scroller\\\")]/li/*/a" 

但是這inspect輸出,所以有些東西會被轉義。如果您puts該字符串,你會得到:

//*[(@id=\"scroller\")]/li/*/a 

而這正是你把字符串但是,你的XPath表達式不應該有屬性值圍繞\",它應該只是有"

因此,您輸入錯誤的XPath表達式,將這些表達式從數據庫中取出,並想知道爲什麼它們是錯誤的。修復你的輸入程序,不要過度轉義,你應該沒問題。

0

ActiveRecord::sanitize_sql方法也許這裏很有用,但它保護的,所以保存的XPath之前,DB嘗試:

ActiveRecord::Base.send :sanitize_sql, your_xpath 
+0

我手動輸入這些路徑到DB(因爲他們是一個有限集合) – Bala