爬蟲中常常會遇到兩種亂碼,一種是中遇到的亂碼,嚴格來說這不是亂碼,這是字元編碼後的結果,而且它根本不亂,只是我們看不懂而已,但是計算機是可以輕易讀懂它是什麼意思的。
第二種便是如下圖所示的情況了?
¡¾éﺣõð渣¬çóö°¡¿-ç°³ìîþóç
▽奻漆桸ごㄛ⑴眥▼-ヶ最拸蚡
這些亂碼是最近筆者在為老師爬取某就業資訊**時遇到的問題。其實之前也遇到過類似的亂碼問題,乙個字元用同一種編碼方式編碼解碼當然會得到該字元本身,而這種亂碼之所以會出現,其本質是字元使用了一種編碼方式進行編碼,然後卻用另一種編碼方式去解碼,所以最終得到了一堆亂七八糟的串。
通常在爬蟲**現這種問題是因為許多網頁的編碼方式是iso-8859-1,而計算機通用的編碼方式是utf-8與gbk,爬蟲獲取資料時獲取到的是資料編碼後的串,而最終我們看到的又是計算機為我們解碼後的結果,所以會出現這些「火星文」,通常來說只需要把這幾種常用的編碼方式兩兩搭配去對這些「火星文」編碼解碼試試,看看哪一種會出正確的結果差不多就可以了。
這種方法相對來說比較憑據經驗,做得多了有時候可以看出這些「火星文」大致是哪組編譯碼出的問題,至少上面兩種情況的「火星文」顯然是不同風格的「火星文」,自然也是不同組的編譯碼出的問題。凡事都有例外,這次我確實沒能試出究竟是哪兩種編碼出的問題。
為了方便以後快速找到哪兩種編碼方式,筆者編寫了以下方法供參考?
# -*- coding=utf-8 -*-
import os
""" 平台:csdn
創作不易,僅供分享
"""class mycode():
def __init__(self,
pypath="e:/python",
codes=none,
): self.pypath = pypath.replace("\\","/")
self.pypath = self.pypath[:-1] if self.pypath[-1]=="/" else self.pypath
if codes: self.codes = codes # 使用者指定編碼列表則使用自定義編碼方式列表
else: # 否則從python根目錄下讀取所有編碼方式
self.codes =
for filename in os.listdir("{}/lib/encodings".format(self.pypath)):
code = filename.split(".")[0]
try: a = "1".encode(code)
except: continue
def transform(self,string,log=false,logpath="c:/users/lenovo/desktop"):
logpath = logpath.replace("\\","/")
logpath = logpath[:-1] if logpath[-1]=="/" else logpath
for x in self.codes:
for y in self.codes:
try: temp = string.encode(x).decode(y)
except: continue
result = "encode:{}\tdecode:{}\tresult:\t{}".format(x,y,temp)
print(result)
if log:
with open("{}/mycode_log.txt","a") as f:
f.write("{}\n".format(result))
if __name__ == "__main__":
mycode = mycode()
mycode.transform("¡¾éﺣõð渣¬çóö°¡¿-ç°³ìîþóç")
注意到,python的根目錄下的lib資料夾中的encodings資料夾中存了一百多種編碼方式的py檔案,如筆者的python根目錄在e:/python/,則該資料夾在e:/python/lib/encodings/?
這些檔案的檔名恰為編碼的名稱,筆者試圖遍歷所有的「編碼方式對」去找到正確的處理方式,上面**執行結果如下?
可以看到使用charmap編碼,gb18030/gb2312/gbk解碼即可使得這串「火星文」變成能夠讀懂的漢字。
當然這種「編碼方式對」未必唯一,有人說一百多種編碼方式對得有一萬多種情況,這該怎麼找呢?
筆者推薦視力好的直接翻了找,視力差的去配副好點的眼鏡,如果瞎了的話就列個常用字元庫(中英文都要有,但一般來說出現火星文都是中文的問題),多寫點**大致判斷一下上圖result後的字串是正常字串的概率是多少,做個預篩選,然後再摸索。
分享學習,共同進步!
如何處理SecureFX中的中文亂碼
分享給大家,也當作給自己記錄下來。首先,在securefx選單中選擇 options global options 然後,在 global options 視窗中,選擇 general configuration path 找到securefx配置檔案所在的路徑,並複製該路徑 接著,在電腦中開啟這個...
如何處理SecureFX中的中文亂碼
情況描述 今天在使用securefx連線伺服器進行資料傳輸時,發現包含中文名稱的檔案在securefx中無法正常顯示,出現的都是亂碼。解決方法 1 開啟securefx,找到含有中文名的路徑,檢視還有中文名的檔案 2 在securefx選單中選擇 options 選項 global options ...
java如何處理linux名字亂碼批量重新命名問題
對於一般批量檔案重新命名處理 第一種 public static void main string args throws ioexception else 但是上述方法在檔名亂碼的情況下就失效了,所以需要下面的方法 在linux底下,檔案都有乙個對應的索引的,可以通過ls i inums.txt,...