XPath 没有任何转义特殊字符的方法,所以这有点棘手。在这种特定情况下,一个解决方案是在 XPath 表达式中使用双引号而不是单引号:
text()="Frank's car"
如果你这样做了,如果你在整个表达式周围使用双引号,你必须从 Ruby 中转义引号:
"//li[text()=\"Frank's car\"]"
如果你不做任何插值,你可以在这里使用单引号,然后转义单引号:
'//li[text()="Frank\'s car"]'
更好的选择可能是使用 Ruby 的灵活引用,这样所有的引号都不需要转义,例如:
%{//li[text()="Frank's car"]}
请注意,这里所有的示例都在 Ruby 中进行 转义,因此到达 XPath 处理器的字符串是 //li[text()="Frank's car"]。
更一般的情况是,当文本是可变的,可以包含单引号或双引号时,难度会更大。 XPath 的字符串文字不能同时包含两种类型的引号;您需要使用XPath concat function 构造字符串。
例如,如果您想匹配字符串"That's mine", he said.,您需要执行以下操作:
text()=concat('"That', "'", 's mine", he said.')
然后您必须从 Ruby 中转义引号(使用 %{} 是最简单的)。
我找到了another question on SO dealing with this issue in C# 和thread on the Nokogiri mailing list,如果您需要进一步研究,这两个可能都值得一看。