看板 Python 關於我們 聯絡資訊
大家好 我最近在爬蟲一個網站 使用的版本是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://www.ptt.cc/bbs/Python/M.1466048341.A.830.html ※ 編輯: allan80625 (118.163.62.150), 06/16/2016 11:39:45
uranusjr: 你上面的那段我砍掉多餘的換行後可以直接執行無誤 06/16 12:20
uranusjr: 所以問題不是這段文字, 是你其他程式 06/16 12:21
你是說把if那段直接print出來嗎? 直接print出來是可以轉成中文 這樣就跟我下面另存成aa的做法一樣 問題點是在爬蟲下來的if那段\u6708無法解碼 原始網站的網站原始碼if那一段也是\u6708這樣顯示 付上處理的網站 http://lvyou.baidu.com/taibei/
CaptainH: 一樓 我想他的意思是html raw text 的\UXXXX 06/16 14:50
是的,那段一直無法解碼成中文
uranusjr: 好像懂了, 可以參考這個 http://bit.ly/1UAtjlT 06/16 17:54
這方法有試過了,還是無法 ※ 編輯: allan80625 (118.163.62.150), 06/16/2016 20:17:45
qwertmn: 其實你已經找到答案了啊~ 他就是json string 06/16 21:34
qwertmn: json.loads(r'"10\u6708-11\u6708"') 06/16 21:35
qwertmn: 另外就是 uranusjr 的方法也是可以work 的喔~ 06/16 21:39
qwertmn: 恩- - 他是js 的dict.. 不是json 沒看仔細XDDDD 06/16 21:45
qwertmn: 不過忘了說, 如果你用json or unicode-escape 都沒辦法處 06/16 23:35
qwertmn: 理, 那應該是系統問題了~ 我自己試都可以 06/16 23:36
s860134: 這問題沒那麼難懂... 你看到 \u6708 的字串在 python 中 06/17 02:28
s860134: 是因為 你輸入'\u6708' \u被視為 unicode 的 prefix 06/17 02:30
s860134: 所以她自然會把他轉成你看到的 10月 06/17 02:30
s860134: 但是網頁原始碼中是真正寫著 "\u6708" 6個字 06/17 02:33
s860134: 從檔案讀進 python 顯示應該是 '\\u6708' 06/17 02:35
s860134: '\\' 代表單斜線,python 字串中單個 \ 是跳脫字元 06/17 02:36
s860134: 簡單來說 print("\u6708")→月,print("\\u6708")→\u6708 06/17 02:48
s860134: len('\u6708') == 1 , len('\\u6708') == 7 06/17 02:56
s860134: 打錯 len('\\u6708') == 6 06/17 02:56
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