1. 程式人生 > >【Beautifulsoup】如何在網頁中通過中文text獲取標籤

【Beautifulsoup】如何在網頁中通過中文text獲取標籤

說明:通常我們所看到的網頁幾乎都是utf-8編碼,這點在網頁原始碼中搜索“charset”可以看到。也可以點選此處的方法檢視,我們在使用beautifulsoup的時候,難免會有使用text屬性來查詢標籤的時候,英文還好,查詢中文的時候(bs.find(text=('鐘錶')),返回的結果幾乎都是None,下面說說這個問題。

當執行以下程式碼時:

html = urllib2.urlopen(url)
bs = BeautifulSoup(html,'lxml')

網頁原始碼將經歷一次編碼轉換,它的原編碼是utf8,我們的bs在使用lxml庫解析網頁時會將網頁原始碼解碼為Unicode編碼資料,bs的預設解碼方式是utf8,很多時候不需要改,此時程式碼得到的bs物件已經是解碼後的Unicode編碼的資料了,當我們接著執行以下程式碼時:

t = bs.find(text=(u"鐘錶品牌分類"))
    print t

若你的程式碼環境是windows,那你的程式碼第一行應該有# -*- coding: utf-8 -*-,意思是宣告編譯器的預設編碼是utf8,以支援中文的輸入;ok,這樣一來我們輸入的所有中文都將會是utf8編碼,你或許已經明白了,是的,bs物件是Unicode,查詢模型是utf8,狗窩裡找母貓,當然一無所獲。明白了原理,問題就好解決:

t = bs.find(text=(u"鐘錶品牌分類"))
    print t
把text文字轉為unicode編碼的資料即可。若你爬取的網頁原始碼的編碼不是utf8,那就在解析的時候指定解碼形式:
bs = BeautifulSoup(html.text,'lxml',from_encoding='gb2312')

當然,如果使用的是強大的requests庫,那麼在使用requests.get(url).text的時候就已經解碼為unicode形式的資料了(如果源網頁不是utf-8編碼則會亂碼),下面的程式碼演示如何得知原網頁的編碼格式。bs得到unicode的資料後,會直接進行解析,無需轉碼。

r = requests.get('http://www.baidu.com',verify=False)
e = chardet.detect(r.content)['encoding']  #檢測原始碼的編碼型別,進行對應解碼
r.encoding = e
print r.text