2012-06-24 20 views
5

Ho bisogno di ottenere tutto il testo da una pagina usando BeautifulSoup. Nella documentazione di BeautifulSoup, è stato dimostrato che è possibile fare soup.get_text() per farlo. Quando ho provato a fare questo su reddit.com, ho ottenuto questo errore:Usa soup.get_text() con UTF-8


UnicodeEncodeError in soup.py:16 
    'cp932' codec can't encode character u'\xa0' in position 2262: illegal multibyte sequence 

ricevo errori come quello sulla maggior parte dei siti che ho controllato.
Ho avuto errori simili quando ho fatto anche lo soup.prettify(), ma l'ho risolto cambiando in soup.prettify('UTF-8'). C'è un modo per risolvere questo problema? Grazie in anticipo!

Aggiornamento 24 giugno
ho trovato un po 'di codice che sembra funzionare per gli altri, ma ho ancora bisogno di utilizzare UTF-8 al posto del default. Codice:


texts = soup.findAll(text=True) 

    def visible(element): 
     if element.parent.name in ['style', 'script', '[document]', 'head', 'title']: 
     return False 
     elif re.match('', str(element)): return False 
     elif re.match('\n', str(element)): return False 
     return True 

    visible_texts = filter(visible, texts) 

    print visible_texts 

L'errore è diverso, tuttavia. Progresso?


UnicodeEncodeError in soup.py:29 
'ascii' codec can't encode character u'\xbb' in position 1: ordinal not in range 
(128) 

risposta

0

Non è possibile eseguire str (testo) se si ha a che fare con unicode nella pagina. Invece di str(), usa unicode().

1

soup.get_text() restituisce una stringa Unicode ed è per questo che si sta verificando l'errore.

È possibile risolvere questo problema in vari modi, tra cui l'impostazione della codifica a livello di shell.

export PYTHONIOENCODING=UTF-8 

È possibile ricaricare sys e impostare la codifica includendo questo nello script.

if __name__ == "__main__": 
    reload(sys) 
    sys.setdefaultencoding("utf-8") 

Oppure è possibile codificare la stringa come utf-8 nel codice. Per il tuo reddit problema qualcosa del genere potrebbe funzionare:

import urllib 
from bs4 import BeautifulSoup 

url = "https://www.reddit.com/r/python" 
html = urllib.urlopen(url).read() 
soup = BeautifulSoup(html) 

# get text 
text = soup.get_text() 

print(text.encode('utf-8'))