问题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’)

本文主要探讨了Python3爬虫在处理网页编码时遇到的问题,包括UnicodeEncodeError和网页中文乱码。问题1是由于URL中存在非ASCII字符导致的错误;问题2是网页源代码中文显示问题。解决办法包括使用chardet库检测网页编码,并用decode方法转换为Unicode编码。
2181

被折叠的 条评论
为什么被折叠?



