A. 為什麼python寫的爬蟲有時候抓取的數據是亂碼
為什麼Python寫的爬蟲有時候抓取的數據是亂碼
寫爬蟲是經常會遇到這樣的問題,這種問題很顯然是編碼問題,解決的方法其實也不難。
你可以用下面的兩個方法來解決你的編碼問題:
第一種是,通過瀏覽器打開你寫的html之後,找到瀏覽器中的文字編碼修改,將編碼改為Unicode編碼,即可修復。
xml takes all the pain out of XML. Stephan Richter lxml是Python語言里和XML以及HTML工作的功能最豐富和最容易使用的庫
B. python爬蟲抓取到的數據用網頁打開時是亂碼,怎麼解決
寫爬蟲是經常會遇到這樣的問題,這種問題很顯然是編碼問題,解決的方法其實也不難。
你可以用下面的兩個方法來解決你的編碼問題:
第一種是,通過瀏覽器打開你寫的html之後,找到瀏覽器中的文字編碼修改,將編碼改為Unicode編碼,即可修復。
第二種方法是修改你的前端代碼:在你的代碼output_html方法中,規定網頁的文字編碼即可
C. Python+requests 爬取網站遇到中文亂碼怎麼辦
1. 遇到的中文亂碼問題
1.1 簡單的開始
使用requests來拔取網站內容十分方便,一個最簡單的代碼段只需要2-3行代碼就行。
點擊(此處)折疊或打開
url='http//www.pythonscraping.com/'
req= requests.get(url)
print(req.text)
tree= html.fromstring(req.text)
print(tree.xpath("//h1[@class='title']/text()"))
- 上面的代碼段起作用的也就3行(2,4,5)代碼就獲取到我們想要的內容。當然還要導入一系列的包,比如說requests、lxml、html等。當然由於http//www.pythonscraping.com/是英文網站,不存在中文亂碼問題。
- 1.2 麻煩的開始
- 本來當時的想法是寫一些基礎模塊,方便之後開發的時候調用,減少重復性工作。為了保證代碼在任何情況下都不會出現bug,所以想著用同樣的代碼爬取中文網站獲取裡面的文字
- 修改上面代碼中的兩行代碼:
點擊(此處)折疊或打開
url='http://sports.sina.com.cn/g/premierleague/index.shtml'
print(tree.xpath("//span[@class='sec_blk_title']/text()"))
- 運行程序可以發現,在語句print(req.text)輸出的內容中,中文字體已經是亂碼了。最後的結果輸出是['?????©è§x86é?x91', '??x80?x9cx9f?x9bx9eé??']
- 2 亂碼解決辦法
- 2.1 試錯
- 由於之前爬取csdn上一個網頁沒有出現亂碼問題,但是在sina體育網站上出現了亂碼,所以當時以為不是編碼問題,以為是文檔壓縮問題。因為csdn獲取的頁面header里沒有「Content-Encodings」屬性,但是sina體育獲取的頁面header有「Content-Encodings」屬性--「Content-Encoding: gzip」。
- 總結:參考上述文獻,結果還是沒有解決問題,但是就考慮是不是方向錯了。不過這部分工作也沒有白做,很多網站返回數據都會有壓縮問題,之後的工作中也能用上。
- 2.2 亂碼終極解決辦法
- 後來查閱官方文檔中response-content相關內容,說明了Requests會自動解碼來自伺服器的內容。Requests會基於HTTP頭部對響應的編碼作出有根據的推測,前提是響應文檔的HTTP headers裡面沒有相關字元集說明。官方文檔還說明了,如果你創建了自己的編碼,並使用codecs模塊進行注冊,你就可以輕松地使用這個解碼器名稱作為r.encoding的值, 然後由Requests來為你處理編碼。(自己沒有使用codecs模塊,所以這里不貼代碼了,不過按官方的說法使用codecs模塊是最簡單的一種方式。)
- 另一份官方文檔片段明確說了reponse編碼處理方式:
- Requests遵循RFC標准,編碼使用ISO-8859-1 。
- 只有當HTTP頭部不存在明確指定的字元集,並且Content-Type頭部欄位包含text值之時, Requests才不去猜測編碼方式。
- 現在直接上實驗結果,在原始代碼中添加以下代碼片段:
點擊(此處)折疊或打開
print(req.headers['content-type'])
print(req.encoding)
print(req.apparent_encoding)
print(requests.utils.get_encodings_from_content(page_content.text))
- 輸出結果分別是:
- text/html
- ISO-8859-1#response內容的編碼
- utf-8#response headers里設置的編碼
- ['utf-8']#response返回的html header標簽里設置的編碼
- 返回的內容是採用『ISO-8859-1』,所以出現了亂碼,而實際上我們應該採用『utf-8』編碼
- 總結:當response編碼是『ISO-8859-1』,我們應該首先查找response header設置的編碼;如果此編碼不存在,查看返回的Html的header設置的編碼,代碼如下:
點擊(此處)折疊或打開
if req.encoding=='ISO-8859-1':
encodings= requests.utils.get_encodings_from_content(req.text)
if encodings:
encoding= encodings[0]
else:
encoding= req.apparent_encoding
encode_content= req.content.decode(encoding,'replace').encode('utf-8','replace')
D. python爬蟲爬到的中文亂碼怎麼辦
爬到的內容,肯定是某種編碼格式(utf-8/gb2312等)的字元串。只需要對它相應的decode一下就可以了。
比如:如果網頁內容是utf-8編碼的,就:'xxx'.decode('utf-8');
如果是gb2312編碼的,就:'xxx'.decode('gb2312')
E. python編寫爬蟲爬到的中文字元總是亂碼,r.encoding也不行
這個頁面是gb2312編碼的,不是utf-8
F. python3,pycharm,寫爬蟲時遇到列印的結果亂碼,希望得到大神的幫助,謝謝啦
這個問題主要是編碼問題,一般需要檢查系統設置、ide設置、python代碼里的編碼,一致改成utf8一般就沒問題。
windows中文默認是gbk,ide就要相應改成gbk才能顯示完整
G. 為什麼python寫的爬蟲有時候抓取的數據是亂碼
1. 使用chrome瀏覽器,打開示例頁面http://tieba..com/p/3295185529?see_lz=1
2. 在帖子標題處,右鍵選擇"審查元素",可以看到標題的源代碼
3. 進行簡單的分析,我們需要獲取的是title後面的內容,根據頁面實際內容,我們編寫相應的正則表達式:
title_re=re.compile('<h1 class="core_title_txt " title="(.*?)"')
4. 同理,我們對帖子內容進行"審查元素",得到內容的源代碼
5. 編寫相應的正則表達式如下:
content_re=re.compile('<div id="post_content_\d*" class="d_post_content j_d_post_content ">(.*?)</div>')
6. 這樣通過urllib2打開頁面後,使用上述的正則表達式進行匹配,再對標題和文本內容進行相應的處理即可
H. python爬蟲抓下來的網頁,中間的中文亂碼怎麼解決
對於python的中文編碼問題可以參考下面的帖子
http : //python .jobbole. com/85482/
對於網頁的中文亂碼,建立使用requests模塊代替urllib\urllib2
requests的content方法,對中文編碼,支持比較好,基本不會出現亂碼。
req=requests.get(url,cookies=mecookies)
print req.content
具體用法,參見下面兩個帖子,較詳細:
http :// blog.csdn . net/iloveyin/article/details/21444613
http : //blog .csdn . net/alpha5/article/details/24964009
I. 執行python腳本出現亂碼怎麼解決
執行python腳本出現亂碼的解決方法:首先把中文解碼為unicode,具體方法如:【decode('utf-8')】;然後再轉化為gbk即可,具體方法如:【encode('gbk')】。
問題:
代碼中指定了UTF-8編碼,但是在cmd命令行窗口時列印的中文仍然會亂碼。
(推薦教程:Python入門教程)
原因:
windows下中文默認的輸出編碼為gbk ,與腳本中定義的UTF-8不一樣,所以出現了解碼失敗的情況。
解決方法:
可以先把中文解碼為unicode,然後再轉化為gbk來解決這個問題。
舉例:
運行結果: