2013-04-20 11 views
9

Ich benutze BeautifulSoup, um einige Inhalte von einer HTML-Seite zu analysieren.Vorschläge auf get_text() in BeautifulSoup

Ich kann aus dem HTML den Inhalt extrahieren, den ich möchte (d. H. Der Text, der in einer span definiert durch die class Myclasse enthalten ist).

result = mycontent.find(attrs={'class':'myclass'}) 

I erhalten dieses Ergebnis:

<span class="myclass">Lorem ipsum<br/>dolor sit amet,<br/>consectetur...</span> 

Wenn ich versuche, den Text zu extrahieren, mit:

result.get_text() 

I erhalten:

Lorem ipsumdolor sit amet,consectetur... 

Wie Sie sehen können, wenn Das Tag <br> wird dort entfernt ist kein Abstand mehr zwischen den Inhalten und zwei Wörter sind concated.

Wie kann ich dieses Problem lösen?

+0

Use 'Inhalt', dann
ersetzen? – Floris

+0

können Sie dies in ein Beispiel einfügen, so dass ich die Antwort akzeptieren kann? danke – user601836

+0

Auf iPhone jetzt. Sie müssen sich in die Nähe eines Computers begeben, um getesteten Code zu erstellen. Ich hoffe, dass jemand anderes in der Zwischenzeit ein Beispiel für Sie erstellen wird. – Floris

Antwort

20

Wenn Sie BS4 verwenden Sie können strings verwenden:

" ".join(result.strings) 
+5

Oder verwenden Sie den Kwarg-Separator, der das gleiche in get_text tut: result.get_text ('separator =' "") -> 'Lorem ipsum dolor sitzen amet, consectetur ...' – Leo

10

Verwenden Sie "Inhalt", ersetzen Sie dann <br>?

Hier ist ein vollständiges (Arbeits, getestet) Beispiel:

from bs4 import BeautifulSoup 
import urllib2 

url="http://www.floris.us/SO/bstest.html" 
page=urllib2.urlopen(url) 
soup = BeautifulSoup(page.read()) 

result = soup.find(attrs={'class':'myclass'}) 
print "The result of soup.find:" 
print result 

print "\nresult.contents:" 
print result.contents 
print "\nresult.get_text():" 
print result.get_text() 
for r in result: 
    if (r.string is None): 
    r.string = ' ' 

print "\nAfter replacing all the 'None' with ' ':" 
print result.get_text() 

Ergebnis:

The result of soup.find: 
<span class="myclass">Lorem ipsum<br/>dolor sit amet,<br/>consectetur...</span> 

result.contents: 
[u'Lorem ipsum', <br/>, u'dolor sit amet,', <br/>, u'consectetur...'] 

result.get_text(): 
Lorem ipsumdolor sit amet,consectetur... 

After replacing all the 'None' with ' ': 
Lorem ipsum dolor sit amet, consectetur... 

Das ist aufwendiger als sehr Sean kompakte Lösung - aber da ich gesagt hatte, ich würde erstellen und teste eine lösung nach den angaben, die ich mir gegeben hatte, als ich konnte, beschloss ich, mein Versprechen einzuhalten. Sie können ein wenig besser sehen, was hier vor sich geht - das <br/> ist ein eigenes Element im Tupel result.contents, aber wenn es in eine Zeichenfolge umgewandelt wird, gibt es "nichts übrig".