2010-04-05 6 views
5

Per esempio, se sto cercando per attributo di un elemento come id:Utilizzando findStrumento di BeautifulSoup per cercare innerText dell'elemento html per ottenere lo stesso risultato della ricerca di attributi?

soup.findAll('span',{'id':re.compile("^score_")}) 

torno una lista di tutto l'elemento arco che corrisponde (che mi piace).

Ma se provo a cercare per innerText dell'elemento HTML come questo:

soup.findAll('a',text = re.compile("discuss|comment")) 

torno solo la parte innerText di elemento posteriore che corrisponde al posto del tutto l'elemento con tag e attributi come ho sarebbe sopra.

È possibile fare a meno di trovare la corrispondenza e ottenere il genitore?

Grazie.

risposta

6

Non si ottiene indietro il testo. Si ottiene un NavigableString con il testo. Questo oggetto ha metodi per andare al genitore, ecc

from BeautifulSoup import BeautifulSoup 
import re 

soup = BeautifulSoup('<html><p>foo</p></html>') 

r = soup.findAll('p', text=re.compile('foo')) 

print r[0].parent 

stampe

<p>foo</p> 
+0

Super, grazie. Fondamentalmente per ottenere ciò che volevo, dovevo semplicemente mappare i risultati, in questo modo: comments = map (lambda x: x.parent, soup.findAll ('a', text = re.compile (". Discuss | comment. "))) – Jack

+0

maplambda è brutto, quindi mi limiterei a fare' [s.parent per s in soup.findAll (...)] ' – nosklo

+0

@Jack: vale anche la pena controllare' lxml.html' - I'm preferendolo su 'BeautifulSoup' poiché quest'ultimo non viene più mantenuto ed è più lento. – nosklo

Problemi correlati