2017-07-01 4 views
1

Angenommen ich habe eine HTML-Zeichenfolge wie folgt:Wie extrahiere ich den Text innerhalb eines Tags mit BeautifulSoup in Python?

<html> 
    <div id="d1"> 
     Text 1 
    </div> 
    <div id="d2"> 
     Text 2 
     <a href="http://my.url/">a url</a> 
     Text 2 continue 
    </div> 
    <div id="d3"> 
     Text 3 
    </div> 
</html> 

ich den Inhalt d2 extrahieren möchten, die NICHT von anderen Tags eingewickelt ist, das Überspringen a url. Mit anderen Worten: Ich möchte ein solches Ergebnis erhalten:

Text 2 
Text 2 continue 

Gibt es eine Möglichkeit, es zu tun mit BeautifulSoup?

Ich versuchte dies, aber es ist nicht korrekt:

soup = BeautifulSoup(html_doc, 'html.parser') 
s = soup.find(id='d2').text 
print(s) 

Antwort

3

Versuchen mit .find_all(text=True, recursive=False):

from bs4 import BeautifulSoup 
div_test=""" 
<html> 
    <div id="d1"> 
     Text 1 
    </div> 
    <div id="d2"> 
     Text 2 
     <a href="http://my.url/">a url</a> 
     Text 2 continue 
    </div> 
    <div id="d3"> 
     Text 3 
    </div> 
</html> 
""" 
soup = BeautifulSoup(div_test, 'lxml') 
s = soup.find(id='d2').find_all(text=True, recursive=False) 
print(s) 
print([e.strip() for e in s]) #remove space 

es wird wieder ein list mit nur text:

[u'\n  Text 2\n  ', u'\n  Text 2 continue\n '] 
[u'Text 2', u'Text 2 continue'] 
1

Sie nur die NavigableString Objekte mit einer einfachen Liste Verständnis bekommen.

tag = soup.find(id='d2') 
s = ''.join(e for e in tag if type(e) is bs4.element.NavigableString) 

Alternativ können Sie die decompose Methode verwenden, um alle untergeordneten Knoten zu löschen, dann alle verbleibenden Elemente mit text bekommen.

tag = soup.find(id='d2') 
for e in tag.find_all() : 
    e.decompose() 
s = tag.text 
Verwandte Themen