这种乱码现象基本上都是编码造成的,我们要转到我们想要的编码,先po一个知识点,嵩天老师在Python网络爬虫与信息提取说到过的:response.encoding是指从HTTP的header中猜测的响应内容编码方式,如果header中不存在charset,则默认编码为ISO-8859-1 ,这样一来某些不规范的服务器返回就必然乱码了;response.apparent_encoding是指从内容中分析出的响应内容编码方式。requests内部的 utils 也提供了一个从返回 body 获取页面编码的函数get_encodings_from_content,这样如果服务器返回的头不含 Charset,再通过 get_encodings_from_content 就可以知道页面的正确编码了。下面是调试的过程:
import requests from requests.exceptions import RequestException def get_one_page(url): try: response=requests.get(url) if response.status_code == 200: #print(response.text) print(response.encoding) print(response.apparent_encoding) r=response.text print(requests.utils.get_encodings_from_content(r)[0]) a=r.encode('ISO-8859-1').decode(requests.utils.get_encodings_from_content(r)[0]) print(a) print('------------------------------------') b = r.encode('ISO-8859-1').decode(response.apparent_encoding) print(b) return None except RequestException: return None def main(): url = 'http://www.mh160.com/' get_one_page(url) if __name__=='__main__': main()
看图!看图!看图!
# response=requests.get(skip_url,headers=self.headers) # # print(response.text.encode('ISO-8859-1').decode('utf-8')) #如果出现乱码,可以直接写下面的通用转换 # html=etree.HTML(response.text.encode(response.encoding).decode(response.apparent_encoding))
如果python抓取网页后用decode解码,报错信息如下:
UnicodeDecodeError: 'gb2312' codec can't decode byte 0xb0 in position 18020: illegal multibyte sequence
推测是网页数据中有错误的字符无法解码,decode有参数errors,设置一下就好啦~
html=etree.HTML(response.text.encode(response.encoding).decode(response.apparent_encoding,errors = 'ignore'))