我在页面中有一个如下所示的元素:
<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")
答案 0 :(得分:4)
答案 1 :(得分:1)
:
,这确实是逃避它的正确方法:
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,因此更简单的语法也可以。