我刚刚开始学习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章做同样的事情。
答案 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模块后,一切正常。