Nur Text aus diesem Element extrahieren, nicht seine untergeordneten Elemente

71

Ich möchte nur den Text aus dem obersten Element meiner Suppe extrahieren. suppe.text gibt jedoch auch den Text aller untergeordneten Elemente an:

ich habe

import BeautifulSoup
soup=BeautifulSoup.BeautifulSoup('<html>yes<b>no</b></html>')
print soup.text

Die Ausgabe dazu ist yesno. Ich möchte einfach "Ja".

Was ist der beste Weg, um dies zu erreichen?

Bearbeiten : Ich möchte yesauch beim Parsen von ' <html><b>no</b>yes</html>' ausgegeben werden .

Drachen
quelle
BeautifulSOAP wurde entfernt. Um den Text des aktuellen Elements nur in bs4 zu erhalten, lesen Sie die Antwort von @Horst Miller hier
aquaman

Antworten:

70

was ist mit .find(text=True)?

>>> BeautifulSoup.BeautifulSOAP('<html>yes<b>no</b></html>').find(text=True)
u'yes'
>>> BeautifulSoup.BeautifulSOAP('<html><b>no</b>yes</html>').find(text=True)
u'no'

BEARBEITEN:

Ich denke, ich habe verstanden, was Sie jetzt wollen. Versuche dies:

>>> BeautifulSoup.BeautifulSOAP('<html><b>no</b>yes</html>').html.find(text=True, recursive=False)
u'yes'
>>> BeautifulSoup.BeautifulSOAP('<html>yes<b>no</b></html>').html.find(text=True, recursive=False)
u'yes'
jbochi
quelle
Im zweiten Fall (wo das no, immer noch in bTags, an erster Stelle steht) möchte ich immer noch, dass die Ausgabe erfolgt yes.
Dragon
@jbochi Funktioniert dafür nicht <h2><a aria-expanded="false" aria-owns="faqGen5" href="#">Is <span class="nobreak">XFINITY WiFi</span> secure?</a></h2>. Ich muss Is secure?fürfind(text=True)
Vishnudev
29

Sie könnten Inhalte verwenden

>>> print soup.html.contents[0]
yes

Oder verwenden Sie findAll (text = True, recursive = False), um alle Texte unter HTML abzurufen.

>>> soup = BeautifulSoup.BeautifulSOAP('<html>x<b>no</b>yes</html>')
>>> soup.html.findAll(text=True, recursive=False) 
[u'x', u'yes']

oben verbunden, um eine einzelne Zeichenfolge zu bilden

>>> ''.join(soup.html.findAll(text=True, recursive=False)) 
u'xyes'
TigrisC
quelle
Ein bisschen funktioniert, hilft aber leider nicht, wenn das HTML umgekehrt ist : <html><b>no</b>yes</html>. Ich nehme an, ich könnte den Inhalt durchlaufen und versuchen, Teile zu finden, die keine Tags sind.
Dragon
12

Das funktioniert bei mir in bs4:

import bs4
node = bs4.BeautifulSoup('<html><div>A<span>B</span>C</div></html>').find('div')
print "".join([t for t in node.contents if type(t)==bs4.element.NavigableString])

Ausgabe:

AC
Horst Miller
quelle
2

Vielleicht möchten Sie sich das Soupparser- Modul von lxml ansehen , das XPath unterstützt:

>>> from lxml.html.soupparser import fromstring
>>> s1 = '<html>yes<b>no</b></html>'
>>> s2 = '<html><b>no</b>yes</html>'
>>> soup1 = fromstring(s1)
>>> soup2 = fromstring(s2)
>>> soup1.xpath("text()")
['yes']
>>> soup2.xpath("text()")
['yes']
mzjn
quelle