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