С BeautifulSoup 3.1.0.1 и Python 2.5.2 и попытка синтаксического анализа веб-страницы на французском языке. Однако как только я вызываю findAll, я получаю следующую ошибку:
UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe9' в позиции 1146: порядковый номер не в диапазоне (128)
Ниже приведен код, который я сейчас использую:
import urllib2
from BeautifulSoup import BeautifulSoup
page = urllib2.urlopen("http://fr.encarta.msn.com/encyclopedia_761561798/Paris.html")
soup = BeautifulSoup(page, fromEncoding = "latin1")
r = soup.findAll("table")
print r
Кто-нибудь знает, почему?
Спасибо!
ОБНОВИТЬ: Согласно повторному запросу, ниже приведен полный Traceback
Traceback (most recent call last):
File "[...]\test.py", line 6, in <module>
print r
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1146-1147: ordinal not in range(128)






Вот еще одна идея. Ваш терминал не может отображать строку Unicode из Python. Интерпретатор сначала пытается преобразовать его в ASCII. Вы должны явно закодировать его перед печатью. Я не знаю точной семантики soup.findAll(). Но это наверно что-то вроде:
for t in soup.findAll("table"):
print t.encode('latin1')
Если t действительно строка. Возможно, это просто еще один объект, из которого вам нужно построить данные, которые вы хотите отобразить.
Терминал должен сообщить интерпретатору Python, какой набор символов он использует. Обычно это делается через переменную окружения. Я не знаю, как с этим справляется IDLE.
print repr (t) также полезен. Как правило, рекомендуется использовать repr (), который вы выводите для целей отладки, чтобы вы могли точно видеть тип и любые скрывающиеся там верхние биты или управляющие символы, а также не заставлять ваш код отладки генерировать больше ложных исключений. .
Оно работает! : D Но что вы имеете в виду, говоря «Ваш терминал не может отображать строку Unicode из Python?». Я запускаю свой скрипт внутри IDLE (Python Shell). Это должно сработать, не так ли?