下载 HTML 时避免 Python Unicode 错误

2 投票
3 回答
951 浏览
提问于 2025-04-17 09:49

我想把网页的源代码下载到一个文件里。但是每次我都遇到一个错误:

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 个回答

1

我不太确定,不过http://www.crummy.com/software/BeautifulSoup/这个网站有一个叫做.prettify()的功能,可以返回格式很好的HTML代码。你可以试试用这个来做“预处理”。

1

问题可能出在你直接想把 str 转换成 utf-8,其实你应该先把 str 转换成 unicode,再转换成 utf-8。换句话说,你可以试试 unicode(s, 'utf-8').encode('utf-8') 这个方法。

想了解更多信息,可以查看这个链接:http://farmdev.com/talks/unicode/

3

有一些第三方库,比如BeautifulSouplxml,可以自动处理编码问题。不过,这里有一个简单的例子,只用到了urlllib2

首先,下载一个包含非ASCII字符的网页:

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

接下来,看看网页顶部的“charset”设置:

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

如果没有明显的charset设置,通常可以猜测为“UTF-8”。

最后,把网页转换成Unicode文本:

>>> text = data.decode('utf-8')

撰写回答