Проблемы с пространством имен XHTML при использовании cssselect в lxml - PullRequest
2 голосов
/ 28 июля 2011

У меня проблемы с использованием cssselect с XHTML (или XML с пространством имен). Хотя в документации сказано, как использовать пространство имен в csselect, я не понимаю этого: пространства имен 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 голосов
/ 28 июля 2011

Строка документа для 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.

...