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 yes
auch beim Parsen von ' <html><b>no</b>yes</html>
' ausgegeben werden .
python
parsing
text
beautifulsoup
Drachen
quelle
quelle
Antworten:
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'
quelle
no
, immer noch inb
Tags, an erster Stelle steht) möchte ich immer noch, dass die Ausgabe erfolgtyes
.<h2><a aria-expanded="false" aria-owns="faqGen5" href="#">Is <span class="nobreak">XFINITY WiFi</span> secure?</a></h2>
. Ich mussIs secure?
fürfind(text=True)
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'
quelle
<html><b>no</b>yes</html>
. Ich nehme an, ich könnte den Inhalt durchlaufen und versuchen, Teile zu finden, die keine Tags sind.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:
quelle
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']
quelle