有没有办法逃脱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')")