我有一个锚标记:
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')")