
python2.7+ubuntu
用 beautifusoup 来解析一个网页,死活都输出不了中文
什么 encode,decode 试了个遍都不行啊
折腾了一下午.....
有过类似经验的 V 友们给点指导啊!
1 bakabie 2016-01-18 19:10:31 +08:00 via Android 检查下 ide 的编码设置是否正确。。。 我之前也是这样,在 pycharm 上无法输出中文。。。结果发现是 pycharm 内置编码没设置正确 |
2 flyer103 2016-01-18 19:15:47 +08:00 黑魔法: ```python import sys reload(sys) sys.setdefaultencoding('utf-8') ``` |
3 yunying 2016-01-18 19:18:42 +08:00 |
5 DuckJK 2016-01-18 19:27:55 +08:00 |
6 windfarer 2016-01-18 19:28:01 +08:00 via Android 先看网页的编码是什么,再在代码里做相应 decode |
7 just1 2016-01-18 19:38:01 +08:00 via Android encode('utf-8').decode('unicode-escape') 送你神器 |
8 zaishanfeng 2016-01-18 19:42:55 +08:00 via Android 楼上的几个方法我都用过 还是有问题 目前遇到的最好的解决方法是 django 的 smart_str |
9 RqPS6rhmP3Nyn3Tm 2016-01-18 19:57:38 +08:00 为什么不用 Python 3 呢,原生支持 utf-8 抓网页直接 decode('utf-8') 就好了 |
12 Yourdaye OP @zaishanfeng 可惜我用的是 flask |
13 lcj2class 2016-01-18 21:20:30 +08:00 |
14 RqPS6rhmP3Nyn3Tm 2016-01-18 21:20:51 +08:00 @Yourdaye 没用过 2 ,不过现在都在慢慢迁移到 3 了,以后可能也不会填坑了吧 |
15 crayhuang 2016-01-18 21:38:21 +08:00 同样被折腾过,用了跟二楼一样的方法解决 |
16 fy 2016-01-18 22:04:16 +08:00 1. 楼主你别用 urllib ,换 requests , resp.text 直接是 unicode , py2 py3 直接 print 都能看 2. 上 Python3 , py2 我们别管了 |
17 Victor215 2016-01-18 22:25:17 +08:00 用 requests + chardet, 爬虫包治百病! |
18 knightdf 2016-01-18 22:40:39 +08:00 全部用 unicode |
19 yaozeyuan93 2016-01-18 22:42:09 +08:00 先不用管 encode/decode 的事。 在程序开始时将编码设成 utf-8 ``` import sys reload(sys) sys.setdefaultencoding('utf-8') ``` 代码里凡是涉及到字符串的,一律使用 u''字符串。 对于外部输入,一律使用 decode 处理成 unicode 字符,确保程序内部是一个纯净的 unicode 字符环境 输出时,视情况 encode 成 utf-8 的 bytes 或者直接输出(让 python 系统自行处理)。 只要做到这些,一般就不会再碰见乱码问题了。 创意来源: Pycon2012 演讲, Unicode 之痛。中文翻译: https://github.com/PyCodersCN/PyCodersCN/blob/6d0c0607dfa609c443eaea5904789cf833ebc679/issue5/unipain.rst 我在自己的知乎助手( py2.7+urllib2+BS4 )里试了一下,很好用。目前为止还没有人向我反馈过乱码 bug |
20 weakiwi 2016-01-18 22:48:17 +08:00 有时候是 ide 自己的问题,建议直接 linux 环境 nano |
21 ltm 2016-01-18 22:49:47 +08:00 你需要 python3 |
22 n6DD1A640 2016-01-18 22:53:25 +08:00 反正能用 python 3 的地方我都用了。。 |
23 jok3r 2016-01-18 23:24:32 +08:00 暑假折腾过一次,用 Python3 解决,后来再转 Python2 ,却又没问题了。 前几天又折腾一次,折腾一晚上,结果发现网页开启了 gzip 压缩,需要先解压再解析。 |
24 zaishanfeng 2016-01-18 23:47:16 +08:00 via Android @Yourdaye 这个只是一个函数 可以 import 直接导入就能用 试过很多方法 什么 reload 什么 requests 什么 encode 有的情况上面的可以解决 但是很多时候试遍了还是不行 只有 smart_str 百试百灵 |
25 quietin 2016-01-18 23:48:17 +08:00 |
26 nooper 2016-01-19 00:11:48 +08:00 via iPad py3 |
27 Delbert 2016-01-19 00:12:00 +08:00 via Android 用 requests 输出文件编码。我曾接解析过一个繁体中文网页差点没折腾死我,后来发现是 ISO1xxxx 编码…… |
28 fy 2016-01-19 00:37:37 +08:00 @Delbert requests 特定网页有一个问题,没记错的话是信任服务器反馈的 encoding 而不是 html 中指定的 encoding 。 不过这个函数官方也写了,我不懂他们为啥不默认开启 |
29 LINAICAI 2016-01-19 02:01:58 +08:00 还从来没遇到过编码问题没法解决的。。。别乱喷 |
30 limbo0 2016-01-19 03:53:07 +08:00 方法是一律导成 unicode |
31 popil1987 2016-01-19 08:53:17 +08:00 由于你没有放出错误,所以说几处容易乱码的你参考一下。 1.确定获取的内容是字符串吗?有可能是 gzip 压缩的 2.用 chardet 检测获取内容的编码,或者存到文件中,用 file 命令查看文件编码 3.获取的内容要 decode 成 unicode 才能输出 4.存到文件要 encode 成某个编码 |
32 laobaozi 2016-01-19 08:54:29 +08:00 via iPhone chardet +1 另外我还遇见过抓取的网页有一部分在终端显示不全,还以为网页是由 js 生成的,直到我把抓取的内容写入文件.... |
33 Hackathon 2016-01-19 08:56:57 +08:00 |
34 ltype 2016-01-19 09:17:38 +08:00 用 python3 啊 |
35 zhuangzhuang1988 2016-01-19 09:23:03 +08:00 所以, 来学 c#吧.. |
36 strahe 2016-01-19 09:35:30 +08:00 python3 从来不考虑这些问题 |
39 zkzipoo 2016-01-19 10:29:27 +08:00 locale charmap #coding:utf-8 怎么不把网页发过来 |
40 zkzipoo 2016-01-19 10:32:47 +08:00 更正一下#coding=utf-8 |
41 picasso250 2016-01-19 11:05:55 +08:00 请使用 PHP |
42 fhefh 2016-01-19 11:41:45 +08:00 学习了~~ |
44 XuanYuan 2016-01-19 12:21:37 +08:00 我也是,被 ruby 的编码问题折腾得够呛。 问题是这样子的: 我现在有一个 utf-8 编码的文本,但是需要把它转换成 ASCII 格式,比如说,原来的“生”字要转换成“\u751F ”。 查了很多资料,还是一头雾水。 |
45 MemoryCorner 2016-01-19 12:48:00 +08:00 用 Python3, 用 Python3, 用 Python3, 早晚要用的。 |
46 cxh116 2016-01-19 15:19:09 +08:00 @XuanYuan 这种在 python 里面叫 "unicode escape" ruby 可以参考这个 http://stackoverflow.com/questions/5560914/how-do-i-escape-a-unicode-string-with-ruby puts '你好'.unpack('U*').map{ |i| "\\u" + i.to_s(16).rjust(4, '0') }.join |
48 XuanYuan 2016-01-20 15:09:10 +08:00 |
49 cxh116 2016-01-20 15:55:03 +08:00 @XuanYuan 用 gsub,自己把下面的正则替换成你自己想要的正则. puts '你好 123abc'.gsub(/[\W]/){|s| s.unpack('U*').map{|i| "\\u" + i.to_s(16).rjust(4, '0')}.join } 正则可以参考这个 http://apidock.com/rails/v3.0.5/ActiveSupport/JSON/Encoding/escape/class |
50 XuanYuan 2016-01-20 17:26:19 +08:00 收到,谢谢! 我再好好学习一下。 |