2013-04-20 12 views
9

Sto utilizzando BeautifulSoup per analizzare alcuni contenuti da una pagina html.Suggerimenti su get_text() in BeautifulSoup

Posso estrarre dal contenuto HTML il contenuto desiderato (ad esempio il testo contenuto in un span definito dalla classe class).

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

ho ottenere questo risultato:

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

Se cerco di estrarre il testo utilizzando:

result.get_text() 

ottengo:

Lorem ipsumdolor sit amet,consectetur... 

Come si può vedere quando il tag <br> viene rimosso lì non c'è più spazio tra i contenuti e due parole sono concesse.

Come posso risolvere questo problema?

+0

Utilizzare i 'contenuti', quindi sostituire
? – Floris

+0

puoi mettere questo in un esempio in modo che io possa accettare la risposta? grazie – user601836

+0

Su iPhone in questo momento. È necessario avvicinarsi a un computer per creare codice testato. Spero che qualcun altro creerà un esempio per te nel frattempo. – Floris

risposta

20

Se si utilizza BS4 è possibile utilizzare strings:

" ".join(result.strings) 
+5

Oppure usa il separatore kwarg, che fa la stessa cosa all'interno di get_text: result.get_text ('separator =' "") -> 'Lorem ipsum dolor sit amet, consectetur ...' – Leo

10

Utilizzare "contenuto", quindi sostituire <br>?

Ecco un completo (lavoro, testato) Esempio:

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() 

Risultato:

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... 

Questo è più elaborato rispetto soluzione molto compatta di Sean - ma dal momento che avevo detto che avrei creare e Ho provato una soluzione lungo le linee che avevo indicato quando potevo, ho deciso di seguire la mia promessa. È possibile vedere un po 'meglio cosa sta succedendo qui - il <br/> è il proprio elemento nella tupla result.contents, ma quando viene convertito in stringa non c'è "niente rimasto".