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 1
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') 就好了 |
10
leavic 2016-01-18 20:09:07 +08:00
@Yourdaye pycharm 默认的 console encoding 是 UTF-8 ,而其他系统的的 console 不一定是这个,所以 console 输出的问题不是单纯靠编码能解决的。
|
12
Yourdaye OP @zaishanfeng 可惜我用的是 flask
|
13
lcj2class 2016-01-18 21:20:30 +08:00 1
|
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 2
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 1
@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 1
@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
收到,谢谢!
我再好好学习一下。 |