2013-07-25 16 views
7

Sto cercando di recuperare del testo dai documenti html con BeautifulSoup. In un caso molto interessante per me, origina un risultato strano e interessante: dopo un certo punto, la zuppa è piena di spazi extra all'interno del testo (uno spazio separa ogni lettera dal seguente). Ho provato a cercare sul Web per trovare una ragione, ma ho incontrato solo alcune notizie sul bug opposto (niente spazi).BeautifulSoup restituisce spazi extra inaspettati

Avete qualche suggerimento o suggerimento sul perché accade e su come risolvere questo problema ?.

Questo è il codice di base che ho creato:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova) 
print soup 

E questa è una linea assunta dai risultati, la linea dove questo problema iniziano a comparire:

value = \" Giuseppe labbate ogm? Non vorremmo nuovi uccelli lontra \ "> < input onmouseover = \" Suggerimento ('< cen terclass = \ \' title _ video \ \ '> <b> G iuseppelabbateo g m? n o n v o r r e m m o n u o v i u c c e l l i c h i a m a t i l o n t r e <

+2

Perché stai stampando 'ultrasoup'? Non dovrebbe essere "zuppa"? – svineet

+0

Lo stesso problema qui con un altro sito web. Sto ancora cercando di capire se questo è un problema con BeautifulSoup o il lxml sottostante. Il software funziona senza problemi su un Python a 32 bit e fallisce con 64 bit. – Matthias

+0

Mi scuso per "ultrasoup", solo un piccolo errore. Certo, il codice giusto era 'print soup' –

risposta

10

Credo che questo sia un bug con parser HTML di lxml. Prova:

from bs4 import BeautifulSoup 

import urllib2 
html = urllib2.urlopen ("http://www.beppegrillo.it") 
prova = html.read() 
soup = BeautifulSoup(prova.replace('ISO-8859-1', 'utf-8')) 
print soup 

Che è una soluzione per il problema. Credo che il problema sia stato risolto in lxml 3.0 alpha 2 e in lxml 2.3.6, quindi potrebbe valere la pena di verificare se è necessario eseguire l'aggiornamento a una versione più recente.

Se volete maggiori informazioni sul bug è stato inizialmente presentato qui:

https://bugs.launchpad.net/beautifulsoup/+bug/972466

Spero che questo aiuti,

Hayden

+0

Funziona perfettamente, grazie.Posso chiederti cosa sostituisce la sostituzione in questo caso? Un'ulteriore domanda: beautifulsoup adotta sempre parser html lxml? In caso contrario, perché lo sto usando e come posso controllare quale parser adotto? Penso che queste potrebbero apparire come domande fittizie, ma io sono un principiante in html che analizza –

+0

@Hayden: Brutto, ma una soluzione funzionante. Grazie per quello. – Matthias

4

È possibile specificare il parser come html.parser:

soup = BeautifulSoup(prova, 'html.parser') 

Anche è possibile specificare il parser html5:

soup = BeautifulSoup(prova, 'html5') 

non è stato ancora installato il parser html5? Installarlo da terminale:

sudo apt-get install python-html5lib 

La xml parser può essere utilizzato (soup = BeautifulSoup(prova, 'xml')), ma si può vedere alcune differenze di multi-valued attributes come class="foo bar".