2009-09-05 12 views
6

Estoy convirtiendo algún código de análisis html de BeautifulSoup a lxml. Estoy tratando de averiguar la sintaxis lxml equivalente para la siguiente declaración BeautifullSoup:lxml equivalente a la sintaxis "O" de BeautifulSoup?

soup.find('a', {'class': ['current zzt', 'zzt']}) 

Básicamente quiero encontrar todos los "a" etiquetas en el documento que tienen un atributo de clase de bien "zzt actual" o "zzt". BeautifulSoup permite pasar una lista, diccionario o incluso un expreso regular para realizar la coincidencia.

¿Cuál es el equivalente lxml?

Gracias!

+0

creo que el XPath expr debe ser: '// a [clase @ = 'zzt actual' o @ class = 'zzt'' – tonfa

+0

(que le falta a] al final) – tonfa

+0

Eso funciona- pero devuelve una lista (como lo haría findall()). ¿Hay alguna forma de que se comporte más como find()? (¿Sin atacar un [0] al final?) – erikcw

Respuesta

3

No, lxml no proporciona el método "buscar primero o devolver ninguno" que esté buscando. Simplemente use (select(soup) or [None])[0] si lo necesita, o escriba una función para que lo haga por usted.

#!/usr/bin/python 
import lxml.html 
import lxml.cssselect 
soup = lxml.html.fromstring(""" 
     <html> 
     <a href="foo" class="yyy zzz" /> 
     <a href="bar" class="yyy" /> 
     <a href="baz" class="zzz" /> 
     <a href="quux" class="zzz yyy" /> 
     <a href="warble" class="qqq" /> 
     <p class="yyy zzz">Hello</p> 
     </html>""") 

select = lxml.cssselect.CSSSelector("a.yyy.zzz, a.yyy") 
print [lxml.html.tostring(s).strip() for s in select(soup)] 
print (select(soup) or [None])[0] 

Ok, así soup.find('a') de hecho podría encontrar primero un elemento o Ninguno como se espera. El problema es que no parece ser compatible con la rica sintaxis de XPath necesaria para CSSSelector.

Cuestiones relacionadas