1

MySQL 列 ( product_path) に値 があります//*[(@id=\"scroller\")]/li/*/a。Nokogiri で使用すると、Nokogiri::XML::XPath::SyntaxError: Invalid expression: Whats wrong がスローされます。

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

バックスラッシュを追加すると、問題が発生するようです。どうすればそれらを取り除くことができますか?

4

2 に答える 2

0

ActiveRecord::sanitize_sqlメソッドはここで役立つかもしれませんが、保護されているため、xpaths を db に保存する前に試してください:

ActiveRecord::Base.send :sanitize_sql, your_xpath
于 2013-08-29T21:41:38.517 に答える