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 .


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'

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'

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

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']
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.