『壹』 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
『貳』 python中文亂碼是怎麼一回事
python報錯invalid character in identifier,意思就是「標識符中的無效字元」,檢查下有沒有字元是中文的,把中文字元改成英文字元再運行就可以了。
Python的作者有意的設計限制性很強的語法,使得不好的編程習慣(例如if語句的下一行不向右縮進)都不能通過編譯。其中很重要的一項就是Python的縮進規則。
一個和其他大多數語言(如C)的區別就是,一個模塊的界限,完全是由每行的首字元在這一行的位置來決定的(而C語言是用一對花括弧{}來明確的定出模塊的邊界的,與字元的位置毫無關系)。這一點曾經引起過爭議。
因為自從C這類的語言誕生後,語言的語法含義與字元的排列方式分離開來,曾經被認為是一種程序語言的進步。不過不可否認的是,通過強制程序員們縮進(包括if,for和函數定義等所有需要使用模塊的地方),Python確實使得程序更加清晰和美觀。
(2)pythin提取數據亂碼怎麼辦擴展閱讀
Python 中文編碼:
Python中默認的編碼格式是 ASCII 格式,在沒修改編碼格式時無法正確列印漢字,所以在讀取中文時會報錯。
解決方法為只要在文件開頭加入# -*- coding: UTF-8 -*-或者# coding=utf-8就行了
注意:# coding=utf-8的=號兩邊不要空格。
實例:
(Python 2.0+)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
print( "你好,世界" )
輸出結果為:
你好,世界
『叄』 為什麼Python寫的爬蟲有時候抓取的數據是亂碼
# -*- coding:utf-8 -*-
import urllib2
import re
url='http://tieba..com/p/3295185529?see_lz=1'
#打開頁面並進行轉碼
page=urllib2.urlopen(url).read().decode('gbk')
print 'Open %s'%url
#去掉超鏈接和圖片
none_re=re.compile('<a href=.*?>|</a>|<img.*?>')
#換行符轉換
br_re=re.compile('<br>')
#標題
title_re=re.compile('<h1 class="core_title_txt " title="(.*?)"')
#帖子內容
content_re=re.compile('<div id="post_content_\d*" class="d_post_content j_d_post_content ">(.*?)</div>')
#搜索文章標題,並去掉文件標題可能含有的特殊符號
title=re.search(title_re,page)
title=title.group(1).replace('\\','').replace('/','').replace(':','').replace('*','').replace('?','').replace('"','').replace('>','').replace('<','').replace('|','')
#搜索文本內容
content=re.findall(content_re,page)
with open('%s.txt'%title,'w') as f:
print 'Writing %s.txt now...'%title
for i in content:
#對html特殊符號進行替換處理
i=re.sub(none_re, '', i)
i=re.sub(br_re, '\n', i)
#寫入文本文件
f.write(i.encode('utf-8').strip()+'\n')
print 'Done!'
『肆』 Python+requests 爬取網站遇到中文亂碼怎麼辦
最近剛開始使用python來做爬蟲爬取相關數據,使用了python自帶的urllib和第三方庫requests,解析html使用了beautifulsoup以及lxml
這里說下lxml,lxml是python的一個html、xml解析庫,lxml使用XPath能快速,簡單的定位元素並獲取信息。下面進入正題
1. 遇到的中文亂碼問題
1.1 簡單的開始
使用requests來拔取網站內容十分方便,一個最簡單的代碼段只需要2-3行代碼就行。
點擊(此處)折疊或打開
url='h.com/'
req= requests.get(url)
print(req.text)
tree= html.fromstring(req.text)
print(tree.xpath("//h1[@class='title']/text()"))
點擊(此處)折疊或打開
url='hemierleague/index.shtml'
print(tree.xpath("//span[@class='sec_blk_title']/text()"))
點擊(此處)折疊或打開
print(req.headers['content-type'])
print(req.encoding)
print(req.apparent_encoding)
print(requests.utils.get_encodings_from_content(page_content.text))
點擊(此處)折疊或打開
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')
『伍』 為什麼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打開頁面後,使用上述的正則表達式進行匹配,再對標題和文本內容進行相應的處理即可
『陸』 python爬取數據出現亂碼怎麼辦
使用decode解碼
str=u'u662f'
print(str.encode().decode('utf-8'))
或者在py文件開頭,添加
#-*-coding:utf-8-*-
『柒』 python讀取共享內存數據時出現亂碼
1. Python文件設置編碼 utf-8 (文件前面加上 #encoding=utf-8)
2. MySQL資料庫charset=utf-8
3. Python連接MySQL是加上參數 charset=utf8
4. 設置Python的默認編碼為 utf-8 (sys.setdefaultencoding(utf-8)
『捌』 python輸出到文件亂碼如何解決
python代碼文件的編碼
py文件默認是ASCII編碼,中文在顯示時會做一個ASCII到系統默認編碼的轉換,這時就會出錯:SyntaxError: Non-ASCII character。需要在代碼文件的第一行或第二行添加編碼指示:
1 # coding=utf-8 ##以utf-8編碼儲存中文字元
2 print '中文'
像上面那樣直接輸入的字元串是按照代碼文件的編碼來處理的,如果用unicode編碼,有以下三種方式:
1 s1 = u'中文' #u表示用unicode編碼方式儲存信息
2 s2 = unicode('中文','gbk')
unicode是一個內置函數,第二個參數指示源字元串的編碼格式。
decode是任何字元串具有的方法,將字元串轉換成unicode格式,參數指示源字元串的編碼格式。
encode也是任何字元串具有的方法,將字元串轉換成參數指定的格式。
(2)、字元串的編碼
用 u'漢字' 構造出來的是unicode類型,不用的話構造出來是str類型
str的編碼是與系統環境相關的,一般就是sys.getfilesystemencoding()得到的值
所以從unicode轉str,要用encode方法
從str轉unicode,所以要用decode
例如:
# coding=utf-8 #默認編碼格式為utf-8
s = u'中文' #unicode編碼的文字
print s.encode('utf-8') #轉換成utf-8格式輸出
但當python中間處理非ASCII編碼時,經常會出現如下錯誤:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128)
0x??是超出128的數字,python在默認的情況下認為語言的編碼是ascii編碼,所以無法處理其他編碼,需要設置python的默認編碼為所需要的編碼。
一個解決的方案是在代碼中添加:
import sys
reload(sys)
sys.setdefaultencoding('utf-8') (其中utf-8為你想輸出的字元編碼)
解釋:
sys.setdefaultencoding方法在python導入site.py後就刪除了(具體代碼查看site.py就可以看到)因此如果想用的話可以再重新load進入
總結:
u=u'unicode編碼文字'
g=u.encode('gbk') #轉換為gbk格式
print g #此時為亂碼,因為當前環境為utf-8,gbk編碼文字為亂碼
str=g.decode('gbk').encode('utf-8') #以gbk編碼格式讀取g(因為他就是gbk編碼的,需要事先知道它是GBK編碼)並轉換為utf-8格式輸出
print str #正常顯示中文(同文件輸出)
安全的方法:
s.decode('gbk','ignore').encode('utf-8′) #以gbk編碼讀取(當然是讀取gbk編碼格式的文字了)並忽略錯誤的編碼,轉換成utf-8編碼輸出。
推薦學習《Python教程》!