python3 爬虫中的编码问题

问题1原网页链接显示:https://baike.baidu.com/item/小肠过敏性紫癜直接抓取报错:url='https://baike.baidu.com/item/小肠过敏性紫癜'urlop=urllib.request.urlopen(url,timeout=100)UnicodeEncodeError: 'ascii' codec can't encode ch...
摘要由CSDN通过智能技术生成

问题1:urlop.read()时报错:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 10-16: ordinal not in range(128)
问题2:抓取到的网页中文乱码
详情
问题1
原网页链接显示:
https://baike.baidu.com/item/小肠过敏性紫癜
在这里插入图片描述
直接抓取报错:

url='https://baike.baidu.com/item/小肠过敏性紫癜'
urlop=urllib.request.urlopen(url,timeout=100)

  

UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-16: ordinal not in range(128)

错误原因
真实网页中,关键字为16位编码
https://baike.baidu.com/item/%E5%B0%8F%E8%82%A0%E8%BF%87%E6%95%8F%E6%80%A7%E7%B4%AB%E7%99%9C

修改

import binascii
#将关键字'小肠过敏性紫癜'改为16位ASCII码
code_16=binascii.b2a_hex('小肠过敏性紫癜'.encode('utf-8'))
print(code_16)
#输出 b'e5b08fe882a0e8bf87e6958fe680a7e7b4abe7999c'
#更改code_16格式
code_16_http=''
for i,x in enumerate(str(code_16)[2:-1]):
    if i%2==0:
        name_16_http+='%'
    code_16_http+=x
print code_16_http
#输出 '%e5%b0%8f%e8%82%a0%e8%bf%87%e6%95%8f%e6%80%a7%e7%b4%ab%e7%99%9c'

#网页链接
url='https://baike.baidu.com/item/'+code_16_http
urlop=urllib.request.urlopen(url,timeout=100)
data=urlop.read()

问题2:网页源代码中文显示
在这里插入图片描述
解决办法
python3
1.查看所爬到的网页编码
import chardet
code = chardet.detect(data)#data为爬到的网页源代码
2.将爬到的网页转换为Unicode编码
data=data.decode(‘code’)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值