有没有办法逃脱Nokogiri css中的非字母数字字符?

时间:2014-08-03 19:31:48

标签: css ruby nokogiri

我有一个锚标记:

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()电话中逃避非字母数字选择器?

1 个答案:

答案 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