作者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://webptt.com/cn.aspx?n=bbs/Python/M.1449994700.A.43C.html
1F:推 atedps: 感谢,成功了!>< 12/13 23:21
2F:推 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
3F:推 POSIX: 神奇招式 12/15 01:00
4F:推 s860134: 我推文回溯被吃掉了 最厉害是你能解出他要的编码 12/15 01:01
5F:→ uranusjr: latin-1 在实务上是万用解码, 只要是 8 bits 一组没有解 12/15 13:58
6F:→ uranusjr: 不开的东西, 所以他不是用猜的, 而是技巧 :) 12/15 13:59
7F:推 s860134: 原来如此 学到一课 12/15 22:10
8F:推 grtfor: 推一下,长知识了 12/16 00:18
9F:推 cobrasgo: html参杂不只一种encode是怎麽回事XDDD 12/18 16:43