前言
目前在优达学诚学习python网络爬虫入门课程,课程中的例子都是以维基百科网页为例子进行讲解和实验。本人一边学习一边用中文网页进行实验,遇到了返回的html结果乱码的问题。
1. requests+beautifulsoup抓取时的乱码问题
以百度百科“北京”词条的页面为例,利用requests+beautifulsoup抓取代码如下:
import requests
from bs4 import BeautifulSoup as bs
html = requests.get('https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC/128981?fr=aladdin')
soup = bs(html.text,'html.parser')
print (soup.title)
返回的结果为乱码:
<title>百度百科——å¨çƒæœ€å¤§ä¸æ–‡ç™¾ç§‘å¨ä¹¦</title>
经过在网上的学习,获得初步解决方法如下:
import requests
from bs4 import BeautifulSoup as bs
html = requests.get('https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC/128981?fr=aladdin')
encoding = html.apparent_encoding #获取该页面的字符集编码类型
html.encoding = encoding #使用该编码类型来对页面编码
soup = bs(html.text,'html.parser')
print (soup.title)
此时返回结果可以正常编码:
<title>百度百科——全球最大中文百科全书</title>
2. urllib.request.urlopen抓取时的编码问题
当使用urllib.request.urlopen来获取url的html文本时也会遇到编码问题,此时可以利用chardet模块来检测html文本的编码类型。
import urllib.request
import chardet
import requests
html = urllib.request.urlopen('https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC/128981?fr=aladdin')
html_text = html.read()
ct = chardet.detect(html_text)
观察所获得的ct:
可以看到,ct为一个dict:第一个键为猜测的编码类型的概率;第二个键为猜测的编码类型。这个结果表示,chardet猜测html_text这个文本有99%的概率为uft-8。将这个编码类型用于html_text的decode:
html_text = html_text.decode(ct['encoding'])
结果可以正常编码: