2011-07-28 58 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