立一個flag在這里,認真解決這個問題
舉個例子,使用requests庫爬取網頁,經常會出現亂碼,尤其是稍微大型一點的網站,比如百度,新浪新聞等。
#coding:utf-8
import requests
#import urllib.request
# 注意這個亂碼的分析 用這個文件解釋的時候,得到的就是亂碼
# 但是用Html_download2 執行的時候,就不是亂碼
# 真的是
class HtmlDownload(object):
def download(self, url):
if url is None:
return None
response = requests.get(url)
if response.status_code!= 200:
return None
#得到html 的全部內容
print response.encoding
#response.encoding=('utf8')
#print response.encoding
return response.text
hd=HtmlDownload()
url='https://baike.baidu.com/'
html_content=hd.download(url)
print (html_content)
如果print 爬取出來的網頁,會出現亂碼。如下圖。
image.png
為什么會這樣,剛剛入門python的時候,被編碼問題搞得對編碼產生了陰影。
看來requests的源碼之后,大概找到了問題,就是requests 如果不能找到指定的編碼,它在爬取網頁的時候,會猜測網頁的編碼,這樣可能會帶來一個問題。
#coding:utf-8
import requests
#import urllib.request
class HtmlDownload(object):
def download(self, url):
if url is None:
return None
response = requests.get(url)
if response.status_code!= 200:
return None
#得到html 的全部內容
print ("ok")
print (">>test")
#輸出response的網頁內容編碼和response的網頁的頭部的編碼
#response的網頁內容編碼
print ('encoding:',response.encoding)
#response的網頁頭部的編碼
print ('apparent_encoding:',response.apparent_encoding)
return response.text
hd=HtmlDownload()
url='https://baike.baidu.com/'
html_content=hd.download(url)
#print (html_content)
image.png
print ('encoding:',response.encoding)
print ('apparent_encoding:',response.apparent_encoding)
的運行結果一個是ISO-8859-1,一個事utf-8,這樣就會帶來問題。
所以,問題解決的方法,也很簡單。
將網頁文本的編碼指定為UTF-8就可以了。
插入如下代碼
response.encoding=('utf8')
image.png
在次爬取一下網頁
image.png
問題已經解決,哇咔咔!
附上源碼:
#coding:utf-8
import requests
#import urllib.request
# 注意這個亂碼的分析 用這個文件解釋的時候,得到的就是亂碼
# 但是用Html_download2 執行的時候,就不是亂碼
# 真的是
class HtmlDownload(object):
def download(self, url):
if url is None:
return None
response = requests.get(url)
if response.status_code!= 200:
return None
#得到html 的全部內容
print ("ok")
print (">>test")
print ('encoding:',response.encoding)
print ('apparent_encoding:',response.apparent_encoding)
response.encoding=('utf8')
print ('encoding :',response.encoding)
return response.text
#print ('encoding:',response.encoding)
#return response.text
hd=HtmlDownload()
url='https://baike.baidu.com/'
html_content=hd.download(url)
print (html_content)
關于編碼問題,參考資料:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
http://blog.chinaunix.net/uid-13869856-id-5747417.html
http://blog.csdn.net/wyb199026/article/details/52562538