使用lxml.html的cssselect在ID属性中选择带冒号的元素

时间:2011-12-13 12:13:24

标签: python unicode lxml

我在页面中有一个如下所示的元素:

<a id="cid-694094:Comment:188384" name="694094:Comment:188384"></a>

如果你document.cssselect("#cid-694094:Comment:188384"),你会得到:

  

lxml.cssselect.ExpressionError:psuedo-class Symbol(u'Comment',12)未知

解决方法是在this question(该人使用Java)处理。

然而,当我在Python中尝试这样的时候:

document.cssselect(r"#cid-694094\:Comment\:188384")

我明白了:

  

lxml.cssselect.SelectorSyntaxError:错误符号'cid-694094 \':'unicodeescape'编解码器无法解码位置10的字节0x5c:\在字符串末尾的[Token(u'#',0)] - &GT;无

可以在this question中找到原因和建议的解决方案。如果我理解正确,我应该这样做:

document.cssselect(r"#cid-694094\\:Comment\\:188384")

但这仍然无效。相反,我再一次得到:

  

lxml.cssselect.ExpressionError:伪类符号(u'Comment \',14)未知

有谁能告诉我我做错了什么?

使用以下方法自行尝试:

import lxml.html
document = lxml.html.fromstring(
    '<a id="cid-694094:Comment:188384" name="694094:Comment:188384"></a>'
)
document.cssselect(r"#cid-694094\:Comment\:188384")

2 个答案:

答案 0 :(得分:4)

ID或类不是: not allowed in css吗?

这是一个解决方法:

document.xpath('//a[@id="cid-694094:Comment:188384"]')

答案 1 :(得分:1)

ID选择器通常不允许

:,这确实是逃避它的正确方法:

document.cssselect(r"#cid-694094\:Comment\:188384")

然而,选择器解析器直到最近才被破坏。 (它并没有真正实现反斜杠转义。)我在cssselect 0.7中修复了这个问题,现在它是一个独立项目,从lxml中提取。

http://packages.python.org/cssselect/

使用它的“新”方式有点冗长:

import cssselect
document.xpath(cssselect.HTMLTranslator().css_to_xpath('#cid-694094\:Comment\:188384'))

lxml 2.4(尚未发布)将使用新的cssselect,因此更简单的语法也可以。