python3爬蟲中文亂碼問題求解?(beautifulsoup4)

最近同學做調查想要登入一些數據,正好我在學python,就幫他做了個爬蟲程序,但是在爬某個網站時遇到中文亂碼,請教各位大神要怎麼解決:
1.涉及的代碼(在調試):
url="http://www.starbaby.cn/zhinan/609987"
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
soup = BeautifulSoup(response)
print(soup)
data=soup.find_all("幼兒園電話")
return data

2.列印的亂碼如下:
一般為中文亂碼

3.嘗試過其他問題所說的gzip壓縮:反應為並不是一個『gzip』 file,所以覺得並不是
4.網站源代碼&標籤中:&


python 3 完全正常啊
沒有管你的採集電話號碼的代碼,只測試了 中文編碼


可能只是輸出控制台的問題。

import sys

reload(sys)

sys.setdefaultencoding("gbk")


添加上面語句試試


我認為是解析網頁的時候網頁編碼的問題
顯式地指定收到的網頁編碼為『utf-8』或者自己轉換一下就好了
urllib這個庫基本沒用過,推薦requests這個庫,相當好用

import requests
url="http://www.starbaby.cn/zhinan/609987"
req =requests.get(url)
req.encoding="utf-8" #顯式地指定網頁編碼,一般情況可以不用
print(req.text)

一般情況下,requests這個庫能默認正確解析編碼的,但這個網站被默認用『ISO-8859-1』解析了,大概就是這麼回事,但為什麼會這樣,並不清楚

# 測試用的python版本:3.4.4,requests版本:2.9.1


謝邀
首先糾正題主,Python用的是解釋器,不是編譯器。

我使用題主的代碼後跟題主出現一樣的問題,原因和解決方法如下

BeautifulSoup用法不對

BeautifulSoup() 第一個位置參數的類型應該是字元串類型或文本文件句柄,第二個位置參數是可選的,用來選擇Beautifulsoup 使用什麼樣的解析器,個人建議使用這個參數。

而變數response的類型是 http.client.HTTPResponse

所以應該使用這個對象的read()方法,但還是有問題,read()返回的是bytes類型,不是字元串,所以要使用decode()方法,得知網頁編碼為utf8,所以代碼如下。
html = response.read().decode("utf8",errors="replace")

然後把html變數傳入Beautifulsoup()就沒問題了:
soup = BeautifulSoup(html)

不過這樣使用的是python自帶的解析器,建議使用 lxml(這個包需要額外裝):
soup = BeautifulSoup(html,"lxml")

我學識淺薄,歡迎和平指正。所以我也不知道為什麼 @黃哥 是正常的,MAC和Windows 導致的差異?


首先,解析出網頁中的charset,得到網頁的編碼,然後轉成utf8。

如果還有問題,說明charset和html本身的編碼不匹配,可以使用chardetect庫來探測編碼,然後再轉成utf8。


可以在首行添加 #coding:utf-8


推薦閱讀:

做python爬蟲需要會web後端嗎,不會的話能做嗎?
求大神們推薦python入門書籍(爬蟲方面)?
python動態的網頁數據json里沒有中文字元怎麼辦?
有沒有python爬蟲視頻教程推薦啊?
通俗的講,網路爬蟲到底是什麼?

TAG:Python | Python3x | beautifulsoup | 網頁爬蟲 |