UnicodeDecodeError使用Python下载HTML

2024-04-25 19:26:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始学习Python,但是当我想写一个工具来帮助我下载在线书籍“学习Vimscript的艰难之路”,我有一个问题。你知道吗

这是我的代码;版本是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章做同样的事情。你知道吗


Tags: nameimportcomhttpresponserequesthtmlvim
2条回答

最后我解决了这个问题,事实上,除了 考虑到gzip,我应该认为提醒我:

byte 0x8b in position 1 usually signals that the data stream is gzipped.

在代码中使用gzip模块后,一切正常。你知道吗

请参阅有效的示例:

import urllib2
import re

name = '/chapters/16.html'
url = 'http://learnvimscriptthehardway.stevelosh.com'
while len(name) > 0:
    url1 = url + name
    response = urllib2.urlopen(url1)
    data = response.read()
    address = './vim/' + name[-7:]
    with open(address, 'w') as fh:
        fh.write(data)
    x = re.findall('''<a class="next" href="(.+?)"''', data)
    if x:
        name = x[0]
    else:
        break

不过,我使用的是python2.7.10。 这段代码从您指定的url下载html格式的所有章节。 注意:替换目录的“./vim/”(当前目录+vim);我使用了name[-7:],它是最后7个字符,如“16.html”等等。条件“if”(if x:…)排除“索引超出范围”错误。你知道吗

相关问题 更多 >

    热门问题