2009-09-05 10 views
6

Sto convertendo un codice di analisi html da BeautifulSoup a lxml. Sto cercando di capire la sintassi lxml equivalente per la seguente dichiarazione BeautifullSoup:lxml equivalente alla sintassi BeautifulSoup "OR"?

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

Fondamentalmente voglio trovare tutte le "a" tag nel documento che hanno un attributo di classe di una "zzt corrente" o "zzt". BeautifulSoup consente di passare una lista, un dizionario o anche un normale express per eseguire la partita.

Qual è l'equivalente lxml?

Grazie!

+0

Penso che xpath expr dovrebbe essere: '// a [@ class = 'corrente zzt' o @ class = 'zzt'' – tonfa

+0

(manca a) alla fine) – tonfa

+0

Che funziona- ma restituisce una lista (come findall() would). Qualche modo per farlo comportarsi più come find()? (Senza solo virare un [0] alla fine?) – erikcw

risposta

3

No, lxml non fornisce il metodo "trova prima o restituisci Nessuno" che si sta cercando. Basta usare (select(soup) or [None])[0] se necessario, o scrivere una funzione per farlo per te.

#!/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, quindi sarebbe davvero soup.find('a') prima trovare un elemento o Nessuno come previsto. Il problema è che non sembra supportare la ricca sintassi XPath necessaria per CSSSelector.

Problemi correlati