有没有一种方法可以转义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::Node:0x007fd1a7df9b90 @type=:ELEMENT_NAME, @value=["*"]>, #<Nokogiri::CSS::Node:0x007fd1a7df9cd0 @
type=:ID, @value=["#unixnut4-CHP-1-SECT-2"
]>]>]' (Nokogiri::CSS::SyntaxError)
我想Nokogiri是在抱怨selectorId中的.1,因为.在html id中无效。

我不拥有内容,所以我真的不想去修复所有的坏id,如果它是可以避免的。是否有一种方法可以在nokoogiri .css()呼叫中逃避非字母数字选择器?

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

<div id='stuff-morestuff-CHP-1-SECT-2.1'>foo</div>

问题中的字符串,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')")

相关内容

  • 没有找到相关文章

最新更新