2012-06-24 9 views
5

Potrzebuję uzyskać cały tekst ze strony za pomocą BeautifulSoup. W dokumentacji BeautifulSoup pokazało, że możesz zrobić to, aby wykonać soup.get_text(). Kiedy próbowałem to zrobić na reddit.com, mam ten błąd:Użyj soup.get_text() z UTF-8


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

otrzymuję błędy tak na większość witryn sprawdziłem.
Mam podobne błędy, gdy robiłem soup.prettify(), ale naprawiłem go, zmieniając go na soup.prettify('UTF-8'). Czy istnieje sposób, aby to naprawić? Z góry dziękuję!

Aktualizacja 24 czerwca
znalazłem kawałek kodu, który wydaje się działać dla innych ludzi, ale nadal trzeba używać UTF-8 zamiast domyślnego. Kod:


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 

Błąd jest jednak inny. Postęp?


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

Odpowiedz

0

Nie możesz zrobić str (tekst), jeśli masz do czynienia z unikodem na stronie. Zamiast str(), użyj unicode().

1

soup.get_text() zwraca ciąg znaków Unicode, dlatego pojawia się błąd.

Można to rozwiązać na wiele sposobów, w tym ustawienie kodowania na poziomie powłoki.

export PYTHONIOENCODING=UTF-8 

Możesz ponownie załadować sys i ustawić kodowanie, włączając to w swoim skrypcie.

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

Lub możesz zakodować ciąg jako utf-8 w kodzie. Dla Twojego problemu Reddit działałoby coś takiego:

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