有没有办法逃脱Nokogiri css中的非字母数字字符?

我有一个锚标记:

file.html#stuff-morestuff-CHP-1-SECT-2.1 

试图在Nokogiri中提取引用的内容:

 documentFragment.at_css('#stuff-morestuff-CHP-1-SECT-2.1') 

失败并出现错误:

 unexpected '.1' after '[#<Nokogiri::CSS: :Node:0x007fd1a7df9b40 @type=:CONDITIONAL_SELECTOR, @value=[#, #]>]' (Nokogiri::CSS::SyntaxError) 

只是试着通过这个 – 我认为Nokogiri抱怨选择器中的.1 ,因为. 在HTML身份证中无效。

我不拥有这些内容,所以如果可以避免的话,我真的不想修复所有错误的ID。 有没有办法在nokogiri .css()调用中转义非字母数字选择器?

假设您的HTML看起来像这样:

 
foo

有问题的字符串stuff-morestuff-CHP-1-SECT-2.1 一个有效的HTML ID ,但它不是一个有效的CSS选择器 – . 字符在那里无效。

你应该能逃脱. 使用斜杠字符,即这是一个有效的CSS选择器:

 #stuff-morestuff-CHP-1-SECT-2\.1 

不幸的是,这似乎不适用于Nokogiri,它可能存在CSS到XPath转换中的错误。 (它在浏览器中工作)。

你可以直接检查id属性来解决这个问题:

 documentFragment.at_css('*[id="stuff-morestuff-CHP-1-SECT-2.1"]') 

即使斜线转义工作,如果它的值以数字开头,你可能必须检查id属性,这在HTML中是有效的,但不能(据我所知)表示为CSS选择器,即使转义也是如此。

你也可以使用XPath,它有一个你可以在这里使用的id函数 :

 documentFragment.xpath("id('stuff-morestuff-CHP-1-SECT-2.1')")