鱼C论坛

 找回密码
 立即注册
查看: 1544|回复: 20

关于网页编码检测的问题

[复制链接]
发表于 2018-12-31 01:31:13 | 显示全部楼层 |阅读模式

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

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

x
在学习了《零基础学Python》的第五十三讲后,我按照作业1的要求,写了一个检测制定URL的程序,然而我发现chardet.detect()方法似乎并没有那么靠谱,如下:
错误判断编码.png
上图显示,这个网页可能是Windows-1254编码的,置信度仅有不到50%
那么问题来了:
1.假如detect()返回的置信度较低的话,那么还有什么函数或者模块可以判断编码,又或者应该做什么处理来提高编码判断的置信度呢?
2.网页是否存在混合编码(如同时具有分别用UTF-8和Unicode编写的内容),假如真的有这种情况,那又如何对网页解码来获取需要的信息呢?

针对问题1,我做了一些尝试,我看了几个网页的源码后发现,网页编码通常在charset后面给出编码类型的名字,于是我用info()获取了网页的信息并封装成一个字典。接着我发现charset总是出现在'Content-Type'这个键的值中,于是我写了一个函数,用来给出这个值,代码如下:
  1. #使用urllib.request模块和chardet模块写一个程序,检测指定URL的编码
  2. import urllib.request #该模块负责向服务器发送请求和获取响应
  3. import chardet #该模块负责辨别从服务器爬取的数据的编码


  4. #获取一个网页的内容
  5. def get_url():

  6.     #获取一个url
  7.     url_name = input('请输入一个网址:\n')

  8.     #访问这个url
  9.     response = urllib.request.urlopen(url_name)
  10.     html = response.read()
  11.     info = response.info()
  12.     return (html,info)

  13. #使用chardet.detect()来检测编码类型
  14. def detect_code():
  15.     result = get_url()
  16.     print(chardet.detect(result[0])) #chardet.detect()方法可以检测一些常见的编码类型,并给出是这种编码类型的可能性
  17.     print('\n')
  18.    
  19. #检查网页<head>标签中的charset的参数(通常该参数的值就是编码类型的名字)
  20. def find_code():
  21.     results = dict(get_url()[1])
  22.     print(results['Content-Type'])
  23.     print('\n')



  24. def test():
  25.     print('测试detect_code()...\n')
  26.     detect_code()
  27.     print('测试find_code()...\n')
  28.     find_code()

  29.    
  30. if __name__ == '__main__':
  31.     test()
复制代码


执行效果如下图所示:
代码测试.png
这里测试了4个网页,发现小甲鱼的网页一般用chardet.detect()是猜不准编码的
而我这个取巧的办法则全部猜出了编码
那么问题又来了,我这里用的办法大牛们应该早就想到了,那么为什么chardet.detect()这个东西没有被弃用呢?它除了检测网页编码类型之外,还有什么妙用吗?


针对问题2,我并没有百度出满意的答案,或许是不存在混合编码这种情况吧,希望可以得到诸位鱼油的确认;如果存在这种情况,那么希望鱼油们指个路,让我学习学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-31 08:06:29 From FishC Mobile | 显示全部楼层

回帖奖励 +2 鱼币

等你学了requests模块就不会有这种问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-2 15:31:10 | 显示全部楼层

回帖奖励 +2 鱼币

看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-2 15:33:50 | 显示全部楼层

回帖奖励 +2 鱼币

get coin
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-2 16:16:19 | 显示全部楼层

回帖奖励 +2 鱼币

第三方的requests模块是比较好用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-2 19:14:13 | 显示全部楼层

回帖奖励 +2 鱼币

niu
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-2 20:57:49 | 显示全部楼层

回帖奖励 +2 鱼币

试试requests,感觉urllib连下载网页都麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-2 21:03:08 | 显示全部楼层
本帖最后由 TCY 于 2019-1-3 13:29 编辑

连requests都这样:
  1. >>> import requests as req
  2. >>> r = req.get("https://fishc.com.cn")
  3. >>> r.apparent_encoding
  4. 'Windows-1254'
  5. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-2 21:40:01 | 显示全部楼层

回帖奖励 +2 鱼币

直接输入域名前的部分不会返回编码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-2 22:07:20 | 显示全部楼层
本帖最后由 TCY 于 2019-1-3 13:30 编辑

我知道原因了:
  1.             display: 'popup', //popup鏂瑰紡娓叉煋楠岃瘉鐮&#65533;
  2.             width: '230px', //楠岃瘉鐮乥utton瀹藉害锛岃&#65533;︾粏鍚&#65533;涔夎&#65533;佸悗鏂&#65533;
  3.             height:'38px',
  4.             container: '#captcha', //楠岃瘉鐮乥utton娓叉煋鐨勭洰鏍嘍OM锛岃嚜鍔ㄥ睍鐜版柟寮忎笅蹇呴渶锛岃&#65533;︽儏瑙佸悗鏂&#65533;
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-3 08:31:29 | 显示全部楼层

回帖奖励 +2 鱼币

学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-3 12:04:35 | 显示全部楼层
本帖最后由 TCY 于 2019-1-3 17:14 编辑

写代码ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-3 12:23:12 | 显示全部楼层
本帖最后由 TCY 于 2019-1-3 17:14 编辑

注释去掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-3 13:41:54 | 显示全部楼层

回帖奖励 +2 鱼币

你这最后的原因是无法识别中文么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-4 03:28:33 | 显示全部楼层
幽梦三影 发表于 2018-12-31 08:06
等你学了requests模块就不会有这种问题了

刚刚学完小甲鱼的基础教程,现在开始向爬虫方向深入学习了,回头用requests来试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-4 03:38:06 | 显示全部楼层
小小小菜菜菜 发表于 2019-1-3 13:41
你这最后的原因是无法识别中文么

不是,我测试的四个网页都是中文网页,区别在于chardet.detect()不能识别出GBK编码。我记得小甲鱼视频好像有说到这个方法只能识别出内置的几种编码,其中对中文是GB-2312,没有GBK编码,这可能是这个方法不好识别GBK码的原因,所以我就想知道有没有方法可以改善这个函数的普适性,提高它的置信度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-4 03:46:34 | 显示全部楼层
幻千城12 发表于 2019-1-2 21:40
直接输入域名前的部分不会返回编码

你这句话的含义我没理解,能举个例子吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-4 03:54:19 | 显示全部楼层
TCY 发表于 2019-1-2 22:07
我知道原因了:

2333,所以原因是啥,和我的问题的关联是什么,这段代码又是指哪里呢?楼主是真·零基础,需要说得更详细一些才能懂哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-5 12:24:28 | 显示全部楼层
GeekLeon 发表于 2019-1-4 03:54
2333,所以原因是啥,和我的问题的关联是什么,这段代码又是指哪里呢?楼主是真·零基础,需要说得更详细 ...


我是指网页中有识别不出的字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-6 10:13:25 | 显示全部楼层

回帖奖励 +2 鱼币

热爱鱼C!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 10:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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