我有一个锚标签:
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 正在抱怨.1
在selectorId中,因为.
在 html id 中无效。
我不拥有这些内容,所以如果可以避免的话,我真的不想检查并修复所有错误的 ID。有没有办法在 nokogiri 中转义非字母数字选择器.css()
call?
假设您的 HTML 看起来像这样:
<div id='stuff-morestuff-CHP-1-SECT-2.1'>foo</div>
有问题的字符串,stuff-morestuff-CHP-1-SECT-2.1
, is a 有效的 HTML ID http://www.w3.org/TR/html5/dom.html#the-id-attribute, 但它isn’t a 有效的 CSS 选择器 http://www.w3.org/TR/selectors/#id-selectors — the .
字符在那里无效。
你应该能够逃脱.
带有斜杠字符,即这是一个有效的 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功能 http://www.w3.org/TR/xpath/#function-id您可以在这里使用:
documentFragment.xpath("id('stuff-morestuff-CHP-1-SECT-2.1')")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)