本人在近期进行Python爬虫编码时遇到两个关于中文乱码的问题:
- url中的出现中文时会报错“”
- 返回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)