作者allan80625 (儿儿)
看板Python
标题[问题] 爬虫编码问题
时间Thu Jun 16 11:38:54 2016
大家好
我最近在爬虫一个网站
使用的版本是python 3.4
在编码上面遇到一个奇怪的问题
首先先request url
url = '
http://lvyou.baidu.com/taibei/'
res = requests.get(url)
res.encoding = 'utf-8'
res.text里面有一段感觉是JavaScript用的json
if(false == "0"){
define('besttime',{text:"10\u6708-11\u6708\u662f\u6e38\u53f0\u5317\u7684\u6700\u4f73\u65f6\u95f4\uff0c\u6b64\u65f6\u6c14\u6e29\u572822\u2103\u201424\u2103"});
}
10\u6708-11 一直编码不出来,原文是简体中文
可是奇怪的是
我在下面另个变数等於他
aa = '10\u6708-11'
print(aa)
>> 10月-11
这样就可以显示了
请问为什麽网页爬下来的编码不成,另存变数却可以?
谢谢大家
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.62.150
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1466048341.A.830.html
※ 编辑: allan80625 (118.163.62.150), 06/16/2016 11:39:45
1F:→ uranusjr: 你上面的那段我砍掉多余的换行後可以直接执行无误 06/16 12:20
2F:→ uranusjr: 所以问题不是这段文字, 是你其他程式 06/16 12:21
你是说把if那段直接print出来吗? 直接print出来是可以转成中文
这样就跟我下面另存成aa的做法一样
问题点是在爬虫下来的if那段\u6708无法解码
原始网站的网站原始码if那一段也是\u6708这样显示
付上处理的网站
http://lvyou.baidu.com/taibei/
3F:推 CaptainH: 一楼 我想他的意思是html raw text 的\UXXXX 06/16 14:50
是的,那段一直无法解码成中文
这方法有试过了,还是无法
※ 编辑: allan80625 (118.163.62.150), 06/16/2016 20:17:45
5F:→ qwertmn: 其实你已经找到答案了啊~ 他就是json string 06/16 21:34
6F:→ qwertmn: json.loads(r'"10\u6708-11\u6708"') 06/16 21:35
7F:→ qwertmn: 另外就是 uranusjr 的方法也是可以work 的喔~ 06/16 21:39
8F:→ qwertmn: 恩- - 他是js 的dict.. 不是json 没看仔细XDDDD 06/16 21:45
9F:→ qwertmn: 不过忘了说, 如果你用json or unicode-escape 都没办法处 06/16 23:35
10F:→ qwertmn: 理, 那应该是系统问题了~ 我自己试都可以 06/16 23:36
11F:→ s860134: 这问题没那麽难懂... 你看到 \u6708 的字串在 python 中 06/17 02:28
12F:→ s860134: 是因为 你输入'\u6708' \u被视为 unicode 的 prefix 06/17 02:30
13F:→ s860134: 所以她自然会把他转成你看到的 10月 06/17 02:30
14F:→ s860134: 但是网页原始码中是真正写着 "\u6708" 6个字 06/17 02:33
15F:→ s860134: 从档案读进 python 显示应该是 '\\u6708' 06/17 02:35
16F:→ s860134: '\\' 代表单斜线,python 字串中单个 \ 是跳脱字元 06/17 02:36
17F:→ s860134: 简单来说 print("\u6708")→月,print("\\u6708")→\u6708 06/17 02:48
18F:→ s860134: len('\u6708') == 1 , len('\\u6708') == 7 06/17 02:56
19F:→ s860134: 打错 len('\\u6708') == 6 06/17 02:56
20F:→ s860134: chr(int('6708',16)) == '\u6708' 06/17 03:07
感谢,成功了,真的是因为两个斜线的问题
後来我用json.dumps(besttime,ensure_ascii=False)
print出来发现是\\u什麽的 所以我又在後面replace(两个斜线,一个斜线)
再用json.loads就可以了
abc = json.dumps(besttime,ensure_ascii=False).replace('\\\\','\\')
aaa = json.loads(abc)
print(aaa) 成功!!
谢谢大家^^
※ 编辑: allan80625 (118.163.62.150), 06/17/2016 10:15:19