【问题标题】:Is there a way to escape non-alphanumeric characters in Nokogiri css?有没有办法在 Nokogiri css 中转义非字母数字字符?
【发布时间】:2014-09-26 07:33:55
【问题描述】:

我有一个锚标签:

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() 调用中转义非字母数字选择器?

【问题讨论】:

    标签: css ruby nokogiri


    【解决方案1】:

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

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

    有问题的字符串stuff-morestuff-CHP-1-SECT-2.1 valid HTML ID,但它不是 valid CSS selector. 字符不是在那里有效。

    您应该能够使用斜杠字符转义 .,即这是一个有效的 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 function,您可以在这里使用:

    documentFragment.xpath("id('stuff-morestuff-CHP-1-SECT-2.1')")
    

    【讨论】:

    • 太好了,谢谢。我没有意识到 ids 和 selectors 有不同的规则。
    猜你喜欢
    • 2022-06-12
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2020-04-28
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多