下载没有Python unicode错误的html

时间:2012-01-09 03:08:14

标签: python html xml unicode character-encoding

我正在尝试将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 个答案:

答案 0 :(得分: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'

如果没有明显的字符集,无论如何,“UTF-8”通常是一个很好的猜测。

最后,将网页转换为unicode文本:

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

答案 1 :(得分:1)

我不确定,但是http://www.crummy.com/software/BeautifulSoup/有一个函数.prettify(),它返回格式良好的HTML。您可以尝试将其用于“预处理”。

答案 2 :(得分:1)

问题可能是你要去str - &gt; utf-8,当您需要str - >&gt; unicode - &gt; utf-8。换句话说,请尝试unicode(s, 'utf-8').encode('utf-8')

有关详细信息,请参阅http://farmdev.com/talks/unicode/