使用Python下载HTML的UnicodeDecodeError

时间:2016-01-20 17:11:55

标签: python unicode character-encoding

我刚刚开始学习Python,但是当我想编写一个工具来帮助我下载在线书“学习Vimscript The Hard Way”时,我遇到了一个问题。

这是我的代码;版本为py3.5

#coding: utf-8
import urllib.request
import re

url = 'http://learnvimscriptthehardway.stevelosh.com'
name = '/chapters/16.html'
while(len(name) != 0):
    url1 = url + name 
    print(url1)
    response = urllib.request.urlopen(url1)
    vim = response.read().decode('utf-8')
    address = "/Users/zhangzhimin/learnvimthehardway/" + name[-2:] + ".html"
    with open(address, "w") as f:
        f.write(vim)
    print("%s finish" % name)
    x = re.findall('''<a class="next" href="(.+?)"''', vim)
    name = x[0]

结果如下:

:!python3 test.py
http://learnvimscriptthehardway.stevelosh.com/chapters/16.html
/chapters/16.html finish
http://learnvimscriptthehardway.stevelosh.com/chapters/17.html
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    vim = response.read().decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte                                                                                        

我不知道为什么会发生这种情况:我可以下载第16章并对其进行解码,但我不能对第17章做同样的事情。

2 个答案:

答案 0 :(得分:0)

请参阅有效的示例:

Id  periodId    periodWeekDayId …..
NULL    NULL        NULL 

我正在使用Python 2.7.10。 此代码从您指定的URL下载html格式的所有章节。 注意:替换&#39; ./ vim /&#39; (目前的dir + vim)为你的目录;我使用了名字[-7:],这是最后7个字符,比如&#39; 16.html&#39;等等。有条件的&#39;如果&#39; (如果x:...)排除&#39;指数超出范围&#39;错误。

答案 1 :(得分:0)

最后我解决了这个问题,事实上,我的代码中的所有内容都没问题 考虑到gzip,我应该想到那个提醒我的人:

  

位置1中的字节0x8b通常表示数据流是gzip压缩的。

在我的代码中使用gzip模块后,一切正常。