[問題] 爬蟲編碼問題

看板Python作者 (兒兒)時間8年前 (2016/06/16 11:39), 8年前編輯推噓1(1019)
留言20則, 4人參與, 最新討論串1/1
大家好 我最近在爬蟲一個網站 使用的版本是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

06/16 12:20, , 1F
你上面的那段我砍掉多餘的換行後可以直接執行無誤
06/16 12:20, 1F

06/16 12:21, , 2F
所以問題不是這段文字, 是你其他程式
06/16 12:21, 2F
你是說把if那段直接print出來嗎? 直接print出來是可以轉成中文 這樣就跟我下面另存成aa的做法一樣 問題點是在爬蟲下來的if那段\u6708無法解碼 原始網站的網站原始碼if那一段也是\u6708這樣顯示 付上處理的網站 http://lvyou.baidu.com/taibei/

06/16 14:50, , 3F
一樓 我想他的意思是html raw text 的\UXXXX
06/16 14:50, 3F
是的,那段一直無法解碼成中文

06/16 17:54, , 4F
好像懂了, 可以參考這個 http://bit.ly/1UAtjlT
06/16 17:54, 4F
這方法有試過了,還是無法 ※ 編輯: allan80625 (118.163.62.150), 06/16/2016 20:17:45

06/16 21:34, , 5F
其實你已經找到答案了啊~ 他就是json string
06/16 21:34, 5F

06/16 21:35, , 6F
json.loads(r'"10\u6708-11\u6708"')
06/16 21:35, 6F

06/16 21:39, , 7F
另外就是 uranusjr 的方法也是可以work 的喔~
06/16 21:39, 7F

06/16 21:45, , 8F
恩- - 他是js 的dict.. 不是json 沒看仔細XDDDD
06/16 21:45, 8F

06/16 23:35, , 9F
不過忘了說, 如果你用json or unicode-escape 都沒辦法處
06/16 23:35, 9F

06/16 23:36, , 10F
理, 那應該是系統問題了~ 我自己試都可以
06/16 23:36, 10F

06/17 02:28, , 11F
這問題沒那麼難懂... 你看到 \u6708 的字串在 python 中
06/17 02:28, 11F

06/17 02:30, , 12F
是因為 你輸入'\u6708' \u被視為 unicode 的 prefix
06/17 02:30, 12F

06/17 02:30, , 13F
所以她自然會把他轉成你看到的 10月
06/17 02:30, 13F

06/17 02:33, , 14F
但是網頁原始碼中是真正寫著 "\u6708" 6個字
06/17 02:33, 14F

06/17 02:35, , 15F
從檔案讀進 python 顯示應該是 '\\u6708'
06/17 02:35, 15F

06/17 02:36, , 16F
'\\' 代表單斜線,python 字串中單個 \ 是跳脫字元
06/17 02:36, 16F

06/17 02:48, , 17F
簡單來說 print("\u6708")→月,print("\\u6708")→\u6708
06/17 02:48, 17F

06/17 02:56, , 18F
len('\u6708') == 1 , len('\\u6708') == 7
06/17 02:56, 18F

06/17 02:56, , 19F
打錯 len('\\u6708') == 6
06/17 02:56, 19F

06/17 03:07, , 20F
chr(int('6708',16)) == '\u6708'
06/17 03:07, 20F
感謝,成功了,真的是因為兩個斜線的問題 後來我用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
文章代碼(AID): #1NOXzLWm (Python)