Проблемы с пространством имен XHTML с помощью cssselect в lxml

У меня проблемы с использованием cssselect с XHTML (или XML с пространством имен). Хотя в документации указано, как использовать пространство имен в csselect, я этого не понимаю: cssselect namespaces

Моя строка ввода 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.

Может ли кто-нибудь помочь мне с этой проблемой пространства имен?

Строка doc для 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.