2010-04-05 3 views
5

Zum Beispiel, wenn ich durch ein Element des Attribut wie id bin auf der Suche:BeautifulSoup's findAll verwenden, um den inneren Text von html-Elementen zu durchsuchen, um das gleiche Ergebnis zu bekommen wie die Suche nach Attributen?

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

ich wieder eine Liste des gesamten Spanne Elements erhalten, das entspricht (die Ich mag).

Aber wenn ich versuche, wie dies durch den Innertext des HTML-Elements suchen:

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

ich wieder nur der innertext Teil des Elements zurück, die mit Tags anstelle das gesamten Elements entspricht und Attribute wie ich wäre oben.

Ist das möglich ohne das Finden der Übereinstimmung und dann, dass es seine Eltern ist?

Danke.

Antwort

6

Sie erhalten den Text nicht zurück. Sie erhalten eine NavigableString mit dem Text. Das Objekt verfügt über Methoden zur Mutter gehen usw.

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 

drucken

<p>foo</p> 
+0

Super-Dank. Um zu bekommen, was ich wollte, musste ich einfach die Ergebnisse abbilden: comments = map (Lambda x: x.parent, soup.findAll ('a', text = re.compile (". Discuss | comment. "))) – Jack

+0

maplambda ist hässlich, also würde ich einfach' [s.parent für s in soup.findAll (...)] ' – nosklo

+0

@Jack: auch lohnt sich zu überprüfen ist' lxml.html' - Ich bin Sie bevorzugen "BeautifulSoup", da letzteres nicht mehr gepflegt wird und langsamer ist. – nosklo