作者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/m.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