Python爬虫:中文报错or乱码问题

本人在近期进行Python爬虫编码时遇到两个关于中文乱码的问题:

  1. url中的出现中文时会报错“”
  2. 返回html中包含中文文本时无法正常显示

看了很多网上的方案,最后总结出如下方法来解决该问题。看了很多文档,此处不一一列举了,请见谅。

关于问题1,需要对url进行编码,可用如下代码:

import urllib #Python官方库

url_basic = 'https://www.baidu.com/s?'
word = {'wd' : "中文"}
# 通过urllib.parse.urlencode进行编码
word_parse = urllib.parse.urlencode(word)
print(word_parse)
#输出:wd=%E4%B8%AD%E6%96%87
#或用urllib.parse.qoute("文字")对中文进行编码,这样需要在结果前加"wd="

url = url_basic + word_parse
print(url)
#输出:https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87。不用担心,不影响搜索结果
print(urllib.parse.unquote(url))
#输出:https://www.baidu.com/s?wd=中文

response = urllib.request.urlopen(url)

关于问题2,需要对返回结果进行decode,中文网站通常用utf-8格式进行decode,要确认的话可以查看head中meta的charset。

通常是将所有爬来的网页都转成utf-8格式。

通过如下代码进行解析返回的变量

response = urllib.request.urlopen(req)
html = response.read()
print(type(html))
#输出:<class 'bytes'>

html = html.decode("utf-8")
print(type(html))
#输出:<class 'str'>,将返回值转成str类型后,再用BeautifulSoup等工具进行解析!

with open("./test.html","w", encoding="utf-8") as f:
    f.write(html)
#注意必须加上encoding="utf-8"!!!否则打开保存的文件仍然会出现乱码

注意,需要将返回值转成str后才能用BeautifulSoup等工具进行解析,不然很容易报错!

前面说到url虽然大多中文网站是utf-8,但是个别可能不是。如果不想一个一个网站去看编码格式。那么可以用requests库进行解析:

import requests #第三方库

response = requests.get(url) #可用前面生成的url
print(response.encoding)
#直接通过response.encoding来获取编码方式,输出:utf-8

#如果想改变编码方式可以直接:response.encoding="gbk"

html = response.text # 不需再decode了
print(type(html))
#输出:<class 'str'>

with open("./testbaidu.html","w", encoding=response.encoding) as f:
    f.write(html)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值