Скачать HTML без ошибок Python Unicode - PullRequest
2 голосов
/ 09 января 2012

Я пытаюсь загрузить page_source в файл. Тем не менее, каждый раз, когда я получаю:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 (or something else) in 
position 8304: ordinal not in range(128)

Я пытался использовать value.encode('utf-8'), но, похоже, каждый раз он выдает одно и то же исключение (в дополнение к попытке вручную заменить все символы, не относящиеся к ascii). Есть ли способ «предварительно обработать» HTML, чтобы перевести его в «пригодный для записи» формат?

Ответы [ 3 ]

3 голосов
/ 09 января 2012

Существуют сторонние библиотеки, такие как BeautifulSoup и lxml , которые могут автоматически решать проблемы с кодировкой.Но вот грубый пример, использующий просто urlllib2:

Сначала загрузите некоторую веб-страницу, содержащую символы, отличные от ascii:

>>> import urllib2
>>> response = urllib2.urlopen('http://www.ltg.ed.ac.uk/~richard/unicode-sample.html')
>>> data = response.read()

Теперь посмотрите на «charset» в верхней частиpage:

>>> data[:200]
'<html>\n<head>\n<title>Unicode 2.0 test page</title>\n<meta
content="text/html; charset=UTF-8" http-equiv="Content-type"/>\n
</head>\n<body>\n<p>This page contains characters from each of the
Unicode\ncharact'

Если не было очевидной кодировки, в любом случае, обычно UTF-8 является хорошим предположением.

Наконец, преобразуйте веб-страницу в текст Unicode:

>>> text = data.decode('utf-8')
1 голос
/ 09 января 2012

Проблема, вероятно, в том, что вы пытаетесь перейти str -> utf-8, когда вам нужно перейти str -> unicode -> utf-8.Другими словами, попробуйте unicode(s, 'utf-8').encode('utf-8').

См. http://farmdev.com/talks/unicode/ для получения дополнительной информации.

1 голос
/ 09 января 2012

Я не уверен, однако http://www.crummy.com/software/BeautifulSoup/ имеет функцию .prettify (), которая возвращает хорошо отформатированный HTML. Вы можете попробовать использовать это для «предварительной обработки».

...