鱼C论坛

 找回密码
 立即注册
查看: 6126|回复: 19

[已解决]小爬虫中 utf-8编码不成功

[复制链接]
发表于 2017-12-6 08:46:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
即使是和小甲鱼一模一样的代码,也是出现编码错误,如下:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb9 in position 251: invalid start byte
其他的简单爬虫也有类似问题,我在网查了下说的编码格式不对,需要转换成相应的格式,但是我把编码格式修改成‘UTF-8’还是出现错误,求诸位给解答下,代码如下:

import urllib.request
import re

def open_url(url):
    req=urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')
    page= urllib.request.urlopen(req)
    html= page.read().decode('utf-8')
    #print(html)
    return html

def get_ip(html):
    #p=r'(?:(?:[01]?\d?\d|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d?\d|2[0-4]\d|25[0-5])'
    p=r'<img src="([^"].jpg)'
    imglist=re.findall(p,html)
    for each in imglist:
        print(each)
   
if __name__=='__main__':
    #url='http://www.kuaidaili.com/free'
   
    url='http://www.lanrentuku.com/vector/design'
    open_url(url)
    #get_ip(open_url(url))
最佳答案
2017-12-6 23:22:02
山沟流水 发表于 2017-12-6 22:17
如果确实是因为压缩导致的,那该怎么解压?刚接触不长时间,不懂的太多了,希望不要见怪

https://zhuanlan.zhihu.com/p/25095566
这里面写了,你好好看看应该就知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-6 10:13:27 | 显示全部楼层
这个我遇到过,可能是你想要获取的网页是以压缩的形式发送给你的,所以你需要先解压再编码,不解压的话会出现这个错误
不过你最好是把报错代码发出来,才能知道具体报错位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-6 22:09:58 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-6 10:13
这个我遇到过,可能是你想要获取的网页是以压缩的形式发送给你的,所以你需要先解压再编码,不解压的话会出 ...

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\自动获取IP.py", line 23, in <module>
    open_url(url)
  File "C:\Users\Administrator\Desktop\自动获取IP.py", line 8, in open_url
    html= page.read().decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb9 in position 251: invalid start byte
这个是返回的错误信息,之前写的别的代码也有这种问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-6 22:17:36 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-6 10:13
这个我遇到过,可能是你想要获取的网页是以压缩的形式发送给你的,所以你需要先解压再编码,不解压的话会出 ...

如果确实是因为压缩导致的,那该怎么解压?刚接触不长时间,不懂的太多了,希望不要见怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-6 22:48:00 | 显示全部楼层
html= page.read().decode('gbk')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-6 23:22:02 | 显示全部楼层    本楼为最佳答案   
山沟流水 发表于 2017-12-6 22:17
如果确实是因为压缩导致的,那该怎么解压?刚接触不长时间,不懂的太多了,希望不要见怪

https://zhuanlan.zhihu.com/p/25095566
这里面写了,你好好看看应该就知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 07:44:13 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-6 23:22
https://zhuanlan.zhihu.com/p/25095566
这里面写了,你好好看看应该就知道了。



链接中说的就是我这种情况,但是按照给出的第一种方法,得出了
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\自动获取IP.py", line 25, in <module>
    open_url(url)
  File "C:\Users\Administrator\Desktop\自动获取IP.py", line 10, in open_url
    html=gzip.decompress(html).decode('utf-8')
  File "E:\python37\lib\gzip.py", line 532, in decompress
    return f.read()
  File "E:\python37\lib\gzip.py", line 276, in read
    return self._buffer.read(size)
  File "E:\python37\lib\gzip.py", line 463, in read
    if not self._read_gzip_header():
  File "E:\python37\lib\gzip.py", line 411, in _read_gzip_header
    raise OSError('Not a gzipped file (%r)' % magic)
OSError: Not a gzipped file (b'<!')
说明这又不是一个 gzip压缩文件,这又是咋回事
TIM截图20171207073148.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 10:23:24 | 显示全部楼层
你的这个网址我刚刚过去看了,网站返回的确是gzip格式的数据
QQ截图20171207102242.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-12-7 11:42:28 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-7 10:23
你的这个网址我刚刚过去看了,网站返回的确是gzip格式的数据

对啊,我查的也是gzip形式的,那估计就是那链接的方法有某种限制条件。总之,谢谢帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 11:53:54 | 显示全部楼层
山沟流水 发表于 2017-12-7 11:42
对啊,我查的也是gzip形式的,那估计就是那链接的方法有某种限制条件。总之,谢谢帮助

你能把改过的代码发出来看看吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 13:33:41 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-7 11:53
你能把改过的代码发出来看看吗?

def open_url(url):

    req=urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')
   
    page= urllib.request.urlopen(req)
    html= page.read()
    html=gzip.decompress(html).decode('utf-8')
    print(html)
就这个函数改动了下,别的没动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 13:58:36 | 显示全部楼层
解决了
QQ截图20171207135750.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 14:49:00 | 显示全部楼层

我以为是我装的版本有问题,刚刚卸载重装了个3.6,还是一样的错误。现在错误应该是我的电脑这边哪里出问题了 TIM截图20171207144711.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 15:09:51 | 显示全部楼层
山沟流水 发表于 2017-12-7 14:49
我以为是我装的版本有问题,刚刚卸载重装了个3.6,还是一样的错误。现在错误应该是我的电脑这边哪里出问 ...

不是电脑问题,是网页编码格式是GBK,而且发送给你的是压缩的,所以是先解压然后decode('GBK')就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 15:23:56 | 显示全部楼层
°蓝鲤歌蓝 发表于 2017-12-7 15:09
不是电脑问题,是网页编码格式是GBK,而且发送给你的是压缩的,所以是先解压然后decode('GBK')就可以了

我试了按照GBK也是这个错误。
我这有疑问:第一,刚刚你用我那个代码成功打印了HTML,说明代码没有问题(如果修改了,请指点下);第二,我的代码错误提示是OSerror,这个错误也会因为格式不一致吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-7 15:34:22 | 显示全部楼层
chakyam 发表于 2017-12-6 22:48
html= page.read().decode('gbk')

还是一样的错误提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 16:38:18 | 显示全部楼层
山沟流水 发表于 2017-12-7 15:34
还是一样的错误提示

我没有改哦,只是没有写成函数而已,你是解压再读取的吗?
本来想发图的,不过今天发图次数满了。
就是下面的代码,我刚刚又运行了一遍,还是没问题,可以读出来。




import urllib.request

url='http://www.lanrentuku.com/vector/design'
req=urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')
page= urllib.request.urlopen(url)
html= page.read().decode('gbk')
#html=gzip.decompress(html).decode('utf-8')
print(html)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-23 21:15:54 | 显示全部楼层
chakyam 发表于 2017-12-6 22:48
html= page.read().decode('gbk')

你的回答解决了我的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-25 09:32:47 | 显示全部楼层
神棍呐 发表于 2017-12-23 21:15
你的回答解决了我的问题。

请教如何解决的 ,我也遇到类似问题。 读取的是从LINUX 的FTP服务器上 下载的 gzip文件( .tar.gz文件) 读取到文件末尾行时 就报错。

代码段如下:
    for temp_name in lst_path:
        lst_path1 =tar_path + temp_name
        oldFileName = gzip.open(lst_path1, 'r+')      # 不解压直接读取 tar.gz 文件
        #oldFileName = open(lst_path1, 'r+', encoding='utf-8')    # 读取 txt 的 MML 结果文件
        Textline=[1]

        while  not Textline=="":
            print(Textline )
            Textline = bytes.decode(oldFileName.readline(),encoding="utf-8")    # 不解压直接读取 tar.gz 文件,并转码   #出错行
            
            #print(Textline)
            Textline1 = ''.join(Textline).strip()
            print(Textline1)
            if  Textline1== "" or (not "命令-----" in Textline1):
                continue
            FUNC = LST_DICT[Textline1]
            FUNC(Textline1, Textline[7:].replace(" ", "_").replace(":;\r\n", "").lower())


报错如下:
Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.2.3\helpers\pydev\pydevd.py", line 1580, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.2.3\helpers\pydev\pydevd.py", line 964, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.2.3\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/zhangweili/PycharmProjects/LSTNR/datafx_js_v2.py", line 1438, in <module>
    Textline = bytes.decode(oldFileName.readline(),encoding="utf-8")    # 不解压直接读取 tar.gz 文件,并转码
  File "C:\Users\zhangweili\AppData\Local\Programs\Python\Python37\lib\gzip.py", line 374, in readline
    return self._buffer.readline(size)
  File "C:\Users\zhangweili\AppData\Local\Programs\Python\Python37\lib\_compression.py", line 68, in readinto
    data = self.read(len(byte_view))
  File "C:\Users\zhangweili\AppData\Local\Programs\Python\Python37\lib\gzip.py", line 463, in read
    if not self._read_gzip_header():
  File "C:\Users\zhangweili\AppData\Local\Programs\Python\Python37\lib\gzip.py", line 411, in _read_gzip_header
    raise OSError('Not a gzipped file (%r)' % magic)
OSError: Not a gzipped file (b'\x99\x12')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-11 05:29:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表