Я просто хочу скачать этот URL ... но он дает мне ошибку! ... Юникод .. (Python) - PullRequest
1 голос
/ 27 ноября 2009
theurl = 'http://bit.ly/6IcCtf/'
urlReq = urllib2.Request(theurl)
urlReq.add_header('User-Agent',random.choice(agents))
urlResponse = urllib2.urlopen(urlReq)
htmlSource = urlResponse.read()
if unicode == 1:
    #print urlResponse.headers['content-type']
    #encoding=urlResponse.headers['content-type'].split('charset=')[-1]
    #htmlSource = unicode(htmlSource, encoding)
    htmlSource =  htmlSource.encode('utf8')
return htmlSource

Пожалуйста, обратите внимание на часть Unicode. Я пробовал эти два варианта ... но не работает.

htmlSource =  htmlSource.encode('utf8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 370747: ordinal not in range(128)

а также это, когда я пытаюсь использовать более длинный метод кодирования ...

_mysql_exceptions.Warning: Incorrect string value: '\xE7\xB9\x81\xE9\xAB\x94...' for column 'html' at row 1

Ответы [ 3 ]

5 голосов
/ 27 ноября 2009

Ваши HTML-данные - это строка, поступающая из Интернета. уже закодирована с некоторой кодировкой. Прежде чем кодировать его в utf-8, вы должны сначала декодировать его .

Python implicity пытается расшифровать его (вот почему вы получаете UnicodeDecodeError not UnicodeEncodeError).

Вы можете решить эту проблему, расшифровав расшифровав свою строку байтов (используя соответствующую кодировку) перед тем, как попытаться перекодировать ее в utf-8.

* * 1 022 Пример: * 1 023 *
utf8encoded = htmlSource.decode('some_encoding').encode('utf-8')

Используйте правильную кодировку, страница была закодирована в первую очередь, вместо 'some_encoding'.

У вас есть , чтобы знать, какую кодировку использует строка, прежде чем вы сможете ее декодировать.

3 голосов
/ 27 ноября 2009

Не декодировать? htmlSource = htmlSource.decode('utf8')

декодирование означает «декодировать htmlSource из кодировки utf8»

кодировать означает «закодировать htmlSource в кодировку utf8»

поскольку вы извлекаете существующие данные (сканируете с веб-сайта), вам необходимо их декодировать, а при вставке в mysql вам может понадобиться кодировать как utf8 в соответствии с вашими сопоставлениями в базе данных mysql db / table / fields.

1 голос
/ 27 ноября 2009

Возможно, вы хотите декодировать Utf8, а не кодировать это:

htmlSource =  htmlSource.decode('utf8')
...