我有一个锚标记:
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。有没有办法在nokogiri .css()
电话中逃避非字母数字选择器?
答案 0 :(得分:1)
假设您的HTML看起来像这样:
<div id='stuff-morestuff-CHP-1-SECT-2.1'>foo</div>
有问题的字符串stuff-morestuff-CHP-1-SECT-2.1
, 是valid HTML ID,但不是 a valid CSS selector - { {1}}字符在那里无效。
您应该能够使用斜杠字符转义.
,即这是一个有效的CSS选择器:
.
不幸的是,这似乎不适用于Nokogiri,它可能会在CSS中对XPath进行翻译。 (它在浏览器中有效。)
您只需直接检查#stuff-morestuff-CHP-1-SECT-2\.1
属性即可解决此问题:
id
即使斜线转义有效,如果它的值以数字开头,你也可能必须检查这样的documentFragment.at_css('*[id="stuff-morestuff-CHP-1-SECT-2.1"]')
属性,这在HTML中有效,但不能(据我所知)表示为一个CSS选择器,即使是转义。
你也可以使用XPath,它有id
function你可以在这里使用:
id