作者ResolaQQ (ResolaQQ)
看板Python
標題Re: [問題] 爬蟲抓下資料Decoding問題
時間Sun Dec 13 16:18:17 2015
>>> wb = u'\xe5\x8d\x97\xe4\xba\xac\xe5\xbe\xa9\xe8\x88\x88'
>>> b = wb.encode('latin-1')
>>> u = b.decode('utf-8')
>>> print(u)
南京復興
※ 引述《atedps (苦哈哈)》之銘言:
: 大家好,鍵盤小弟最近因為研究需求需要北捷各站點間通勤時間的資料,
: 而台北市政府的Open Data好像也沒有找到這方面的資料。因此
: 想說自己寫了一隻爬蟲去抓這些資料,但抓下來的資料在中文
: 站名的部分總會變成亂碼,我大概知道這是Encoding或Decoding
: 相關的問題,但是礙於自己這方面知識沒有很充足,所以昨天
: Google了很久還是找不到答案,因此決定來問問版上的大大們。
: 我是使用最基本的方式用request抓下html檔案後再用BeautifulSoup去分析,
: 但取出來的中文text會變成一個unicode的type的物件
: 如u'\xe5\x8d\x97\xe4\xba\xac\xe5\xbe\xa9\xe8\x88\x88'
: 但如果我手動把這個物件引號部分的資料複製出來當作一個字串再用utf8去decode的話就
: 可以順利跑出中文字。如:
: tex = '\xe5\x8d\x97\xe4\xba\xac\xe5\xbe\xa9\xe8\x88\x88'
: msg = tex.decode('utf8')
: print msg
: 南京復興
: 因此我想問的是,有沒有什麼方式是可以把我原本unicode物件裡面引號的部分
: 取出來的,因為我也不可能每次都用手動去複製貼上QQ。或者是有沒有辦法
: 讓我一開始抓下來的中文字不要變成unicode物件,而直接是一個單純字串。
: 我試過str()的方式,裡面的文字會變成另外一個編碼,造成decode出來跟原本的
: 文字會不一樣
: 先感謝各位了 >_<
--
放著養蚊子的部落格
http://resolaqq.blogspot.tw
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.246.167.53
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1449994700.A.43C.html
推 atedps: 感謝,成功了!>< 12/13 23:21
推 atedps: 可以請問為什麼encode和decode是不同的編碼方式嗎? 12/13 23:33
那個 encode 沒有意義,隨便一個 8 位字符集都行
你這問題是中文 bytes 被錯誤的 decode 成 unicode 所以無法處理
要處理就得先把沒意義的 unicode encode 回有意義的 bytes 之後才能正確 decode
要把 bytes 給錯誤的 decode 也不是那麼容易
最簡單且必成功的方法就是把 bytes 可能的 256 種數值映射到 unicode 的 0 ~ 255
也就是簡單的一對一關係,從你的範例來看就是這種情形
所以要橋回去只要找一個有 256 個字元的字符集就行了
預設 ascii 只有 128 個字元所以不行
latin-1 是第一個有 256 個字元的字符集,我也沒記還有哪個字符集是 256 個字元的
這方法也許並不正確,前一篇有版友提的方法應該才是正道
但是我印象中用其他 lib 有出過問題,好像是遇到 html 參雜不只一種 encode 吧?
記憶模糊,你可能要自己多嘗試看看,html 會遇到很多怪問題
※ 編輯: ResolaQQ (1.168.84.187), 12/14/2015 00:38:33
推 POSIX: 神奇招式 12/15 01:00
推 s860134: 我推文回溯被吃掉了 最厲害是你能解出他要的編碼 12/15 01:01
→ uranusjr: latin-1 在實務上是萬用解碼, 只要是 8 bits 一組沒有解 12/15 13:58
→ uranusjr: 不開的東西, 所以他不是用猜的, 而是技巧 :) 12/15 13:59
推 s860134: 原來如此 學到一課 12/15 22:10
推 grtfor: 推一下,長知識了 12/16 00:18
推 cobrasgo: html參雜不只一種encode是怎麼回事XDDD 12/18 16:43