lxml: cssselect (): AttributeError: ‘lxml.etree._Element’ objeto no tiene ningún atributo ‘cssselect’

¿Alguien puede explicar por qué la primera llamada a root.cssselect() funciona, mientras que la segunda falla?

 from lxml.html import fromstring from lxml import etree html='example</html' root = fromstring(html) print 'via fromstring', repr(root) # via fromstring  print root.cssselect("a") root2 = etree.HTML(html) print 'via etree.HTML()', repr(root2) # via etree.HTML()  root2.cssselect("a") # --> Exception 

Yo obtengo:

 Traceback (most recent call last): File "/home/foo_eins_d/src/foo.py", line 11, in  root2.cssselect("a") AttributeError: 'lxml.etree._Element' object has no attribute 'cssselect' 

Versión: lxml==3.4.4

La diferencia está en el tipo de elemento. Ejemplo –

 In [12]: root = etree.HTML(html) In [13]: root = fromstring(html) In [14]: root2 = etree.HTML(html) In [15]: type(root) Out[15]: lxml.html.HtmlElement In [16]: type(root2) Out[16]: lxml.etree._Element 

lxml.html.HTMLElement tiene el método cssselect() . Además, HTMLElement es una subclase de etree._Element .

Pero el lxml.etree._Element no tiene ese método.

Si desea analizar html, debe usar lxml.html .