lxml中cssselect的XHTML命名空间问题
我在使用cssselect处理XHTML(或者带有命名空间的XML)时遇到了问题。虽然文档里有说明如何在cssselect中使用命名空间,但我还是不太明白:cssselect命名空间
这是我输入的XHTML字符串:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Teststylesheet</title>
<style type="text/css">
/*<![CDATA[*/
ol{margin:0;padding:0}
/*]]>*/
</style>
</head>
<body>
</body>
</html>
这是我的Python脚本:
parser = etree.XMLParser()
tree = etree.fromstring(xhtmlstring, parser).getroottree()
for style in CSSSelector("style")(tree):
print "HAVE CSS!"
这个Python脚本没有打印出任何Have CSS!
。用etree.HTMLParser
替代etree.XMLParser
可以正常工作,但我真的想用XMLParser,并保持XHTML的所有内容(命名空间、结构)。
有没有人能帮我解决这个命名空间的问题?
1 个回答
3
对于 cssselect.CSSSelector(2.0版)的文档说明,里面提到了如何使用命名空间:
class CSSSelector(etree.XPath):
""" ...
To use CSS namespaces, you need to pass a prefix-to-namespace
mapping as ``namespaces`` keyword argument::
>>> rdfns = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
>>> select_ns = cssselect.CSSSelector('root > rdf|Description',
... namespaces={'rdf': rdfns})
>>> rdf = etree.XML((
... '<root xmlns:rdf="%s">'
... '<rdf:Description>blah</rdf:Description>'
... '</root>') % rdfns)
>>> [(el.tag, el.text) for el in select_ns(rdf)]
[('{http://www.w3.org/1999/02/22-rdf-syntax-ns#}Description', 'blah')]
"""
如果你尝试过这个,但你使用的 cssselect.CSSSelector
没有 namespaces
这个参数,那可能是因为你的 lxml 版本需要更新了。