欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Python爬取網(wǎng)頁(yè)的編碼處理

 更新時(shí)間:2016年11月04日 10:18:41   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇淺談Python爬取網(wǎng)頁(yè)的編碼處理。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

背景

中秋的時(shí)候,一個(gè)朋友給我發(fā)了一封郵件,說(shuō)他在爬鏈家的時(shí)候,發(fā)現(xiàn)網(wǎng)頁(yè)返回的代碼都是亂碼,讓我?guī)退麉⒅\參謀(中秋加班,真是敬業(yè)= =!),其實(shí)這個(gè)問題我很早就遇到過(guò),之前在爬小說(shuō)的時(shí)候稍微看了一下,不過(guò)沒當(dāng)回事,其實(shí)這個(gè)問題就是對(duì)編碼的理解不到位導(dǎo)致的。

問題

很普通的一個(gè)爬蟲代碼,代碼是這樣的:

# ecoding=utf-8
import re
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'
res = requests.get(url)
print res.text

目的其實(shí)很簡(jiǎn)單,就是爬一下鏈家的內(nèi)容,但是這樣執(zhí)行之后,返回的結(jié)果,所有涉及到中文的內(nèi)容,全部會(huì)變成亂碼,比如這樣

<script type="text/template" id="newAddHouseTpl">
 <div class="newAddHouse">
  自从您上次浏览(<%=time%>ï¼‰ä¹‹åŽï¼Œè¯¥æœç´¢æ¡ä»¶ä¸‹æ–°å¢žåŠ äº†<%=count%>套房源
  <a href="<%=url%>" class="LOGNEWERSHOUFANGSHOW" <%=logText%>><%=linkText%></a>
  <span class="newHouseRightClose">x</span>
 </div>
</script>

這樣的數(shù)據(jù)拿來(lái)可以說(shuō)毫無(wú)作用。

問題分析

這里的問題很明顯了,就是文字的編碼不正確,導(dǎo)致了亂碼。

查看網(wǎng)頁(yè)的編碼

從爬取的目標(biāo)網(wǎng)頁(yè)的頭來(lái)看,網(wǎng)頁(yè)是用utf-8來(lái)編碼的。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

所以,最終的編碼,我們肯定也要用utf-8來(lái)處理,也就是說(shuō),最終的文本處理,要用utf-8來(lái)解碼,也就是:decode('utf-8')

文本的編碼解碼

Python的編碼解碼的過(guò)程是這樣的,源文件 ===》 encode(編碼方式) ===》decode(解碼方式),在很大的程度上,不推薦使用

import sys
reload(sys)
sys.setdefaultencoding('utf8')

這種方式來(lái)硬處理文字編碼。不過(guò)在某些時(shí)候不影響的情況下,偷偷懶也不是什么大問題,不過(guò)比較建議的就是獲取源文件之后,使用encode和decode的方式來(lái)處理文本。

回到問題

現(xiàn)在問題最大的是源文件的編碼方式,我們正常使用requests的時(shí)候,它會(huì)自動(dòng)猜源文件的編碼方式,然后轉(zhuǎn)碼成Unicode的編碼,但是,畢竟是程序,是有可能猜錯(cuò)的,所以如果猜錯(cuò)了,我們就需要手工來(lái)指定編碼方式。官方文檔的描述如下:

When you make a request, Requests makes educated guesses about the encoding of the response based on the HTTP headers. The text encoding guessed by Requests is used when you access r.text. You can find out what encoding Requests is using, and change it, using the r.encoding property.

所以我們需要查看requests返回的編碼方式到底是什么?

# ecoding=utf-8
import re
import requests
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
print res.encoding

打印的結(jié)果如下:

ISO-8859-1

也就是說(shuō),源文件使用的是ISO-8859-1來(lái)編碼。百度一下ISO-8859-1,結(jié)果如下:

ISO8859-1,通常叫做Latin-1。Latin-1包括了書寫所有西方歐洲語(yǔ)言不可缺少的附加字符。

問題解決

發(fā)現(xiàn)了這個(gè)東東,問題就很好解決了,只要指定一下編碼,就能正確的打出中文了。代碼如下:

# ecoding=utf-8
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
res.encoding = ('utf8')

print res.text

打印的結(jié)果就很明顯,中文都正確的顯示出來(lái)了。

另一種方式是在源文件上做解碼和編碼,代碼如下:

# ecoding=utf-8
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
# res.encoding = ('utf8')

print res.text.encode('ISO-8859-1').decode('utf-8')

另:ISO-8859-1也叫做latin1,使用latin1做解碼結(jié)果也是正常的。

關(guān)于字符的編碼,很多東西可以說(shuō),想了解的朋友可以參考以下大神的資料。

•《The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)》

以上這篇淺談Python爬取網(wǎng)頁(yè)的編碼處理就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在Python中實(shí)現(xiàn)函數(shù)重載的示例代碼

    在Python中實(shí)現(xiàn)函數(shù)重載的示例代碼

    這篇文章主要介紹了在Python中實(shí)現(xiàn)函數(shù)重載的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Python實(shí)現(xiàn)圖書管理系統(tǒng)設(shè)計(jì)

    Python實(shí)現(xiàn)圖書管理系統(tǒng)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖書管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • python pygame模塊編寫飛機(jī)大戰(zhàn)

    python pygame模塊編寫飛機(jī)大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了python pygame模塊編寫飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • python cx_Oracle的基礎(chǔ)使用方法(連接和增刪改查)

    python cx_Oracle的基礎(chǔ)使用方法(連接和增刪改查)

    這篇文章主要給大家介紹了關(guān)于python cx_Oracle的基礎(chǔ)使用方法,其中包括連接、增刪改查等基本操作,并給大家分享了python 連接Oracle 亂碼問題的解決方法,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 淺析python中while循環(huán)和for循環(huán)

    淺析python中while循環(huán)和for循環(huán)

    在本篇文章里小編給各位整理的是關(guān)于python中while和for循環(huán)知識(shí)點(diǎn)詳解,有興趣的朋友們可以學(xué)習(xí)下。
    2019-11-11
  • 淺談Python 列表字典賦值的陷阱

    淺談Python 列表字典賦值的陷阱

    今天小編就為大家分享一篇淺談Python 列表字典賦值的陷阱,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • django傳值給模板, 再用JS接收并進(jìn)行操作的實(shí)例

    django傳值給模板, 再用JS接收并進(jìn)行操作的實(shí)例

    今天小編就為大家分享一篇django傳值給模板, 再用JS接收并進(jìn)行操作的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python3.6通過(guò)自帶的urllib通過(guò)get或post方法請(qǐng)求url的實(shí)例

    Python3.6通過(guò)自帶的urllib通過(guò)get或post方法請(qǐng)求url的實(shí)例

    下面小編就為大家分享一篇Python3.6通過(guò)自帶的urllib通過(guò)get或post方法請(qǐng)求url的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python的圖形用戶界面介紹

    python的圖形用戶界面介紹

    大家好,本篇文章主要講的是python的圖形用戶界面介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Python中的內(nèi)置函數(shù)isdigit()

    Python中的內(nèi)置函數(shù)isdigit()

    這篇文章主要介紹了Python中的內(nèi)置函數(shù)isdigit(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論