鱼C论坛

 找回密码
 立即注册
查看: 1821|回复: 5

[已解决]跪求大神帮忙!下载百度百科的内容后无法正确编码输出

[复制链接]
发表于 2019-8-30 20:00:09 | 显示全部楼层 |阅读模式

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

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

x
我首先打开了《网络爬虫》这一页
444.PNG
复制了url
然后最开始的代码是:
import urllib.request
url='https://baike.baidu.com/item/网络爬虫'
response=urllib.request.urlopen(url).read()
content=response.decode('utf-8')
print(content)
出现的错误为:
555.PNG


后面查资料后发现,print函数本身对于utf-8里面的一些编码无法正确打印出来

所以我修改了一下代码,想把内容先打印在txt里面。
修改后的代码为:
import urllib.request
url='https://baike.baidu.com/item/网络爬虫'
response=urllib.request.urlopen(url).read()
content=response.decode('utf-8')
with open('D://baike.txt','w',encoding='utf-8') as f:
    f.write(content)

但还是出现了一样的错误
666.PNG

我的问题就是:我一开始用utf-8解码了网页,然后在文件里面,规定也是用‘utf-8’,为什么还会出现错误呢?而且为什么错误是ascii无法encode呢?
这个问题我总是遇到,希望有大神能指导一下!
最佳答案
2019-8-31 00:01:28
本帖最后由 傻纸 于 2019-8-31 00:04 编辑

这个不是读取后网页编码的问题,而是你的url上带有中文“网络爬虫”,这个中文不能编码为ascii,使用urllib.parse解析一下
  1. import urllib.request
  2. import urllib.parse

  3. url="https://baike.baidu.com/item/"+urllib.parse.quote("网络爬虫")
  4. #url='https://baike.baidu.com/item/网络爬虫'

  5. response=urllib.request.urlopen(url).read()
  6. content=response.decode('utf-8')

  7. with open('D://baike.txt','w',encoding='utf-8') as f:
  8.    f.write(content)
复制代码

提示里面出错的语句:
111.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-30 20:45:53 | 显示全部楼层
cchardet 比chardet准确度高,速度快

cchardet.detect()返回字典,其中confidence是检测精确度,encoding是编码形式



1:网页编码判断:
import requests
import cchardet

res = requests.get('http://www.baidu.com/')
rawdata  = res.content
cchardet.detect(rawdata)

>>>{'confidence': 0.98999999999999999, 'encoding': 'GB2312'}



2:文件编码判断

import cchardet

with open('c:\\111.txt','rb') as f:
        msg=f.read()

enc = cchardet.detect(msg)
enc = enc['encoding']
print(enc)



# 以指定编码打开文件
with open("新建文本文档.txt", "r", encoding=enc) as f:
    print(f.read())


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 00:01:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻纸 于 2019-8-31 00:04 编辑

这个不是读取后网页编码的问题,而是你的url上带有中文“网络爬虫”,这个中文不能编码为ascii,使用urllib.parse解析一下
  1. import urllib.request
  2. import urllib.parse

  3. url="https://baike.baidu.com/item/"+urllib.parse.quote("网络爬虫")
  4. #url='https://baike.baidu.com/item/网络爬虫'

  5. response=urllib.request.urlopen(url).read()
  6. content=response.decode('utf-8')

  7. with open('D://baike.txt','w',encoding='utf-8') as f:
  8.    f.write(content)
复制代码

提示里面出错的语句:
111.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-31 13:46:12 | 显示全部楼层
傻纸 发表于 2019-8-31 00:01
这个不是读取后网页编码的问题,而是你的url上带有中文“网络爬虫”,这个中文不能编码为ascii,使用urllib. ...

哭了,真的就可以成功运行了。
所以urllib.parse.quote()相当于就是将中文编码为ascii是吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 14:31:44 | 显示全部楼层
本帖最后由 傻纸 于 2019-8-31 14:51 编辑
象的失踪 发表于 2019-8-31 13:46
哭了,真的就可以成功运行了。
所以urllib.parse.quote()相当于就是将中文编码为ascii是吗?


这个我也不太懂,只是记得用法。我觉得可能直接往request里传url,就会使用默认的sacii编码器吧,中文直接编码为ascii,然后就出错,你可以print输出一下urllib.parse.quote("网络爬虫")的值,看是个啥,先转换成某种形式,再传入
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-31 23:14:00 | 显示全部楼层
傻纸 发表于 2019-8-31 14:31
这个我也不太懂,只是记得用法。我觉得可能直接往request里传url,就会使用默认的sacii编码器吧,中文 ...

好滴!谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 07:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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