2011-07-28 26 views
2

我在使用cssselect和XHTML(或带有命名空间的XML)时遇到了问题。虽然文件说,如何在csselect使用命名空间我不明白:cssselect namespaceslxml中的cssselect引起的XHTML命名空间问题

我输入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的一切(名称空间,结构)。

任何人都可以帮我解决这个命名空间问题吗?

回答

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的版本可能需要升级。

+2

谢谢!我刚刚在CSSSelector(“style”)(tree):'with'CSSSelector(“xhtml | style”,namespaces = {'xhtml':'http:// www。 w3.org/1999/xhtml'})(树):'它工作!在我看来,cssselect和命名空间的文档可以改进。 :-) – therealmarv