[問題] 用lxml.html.parse 抓 big5 的html問題...

看板Python作者 (..)時間13年前 (2011/07/25 13:56), 編輯推噓0(0011)
留言11則, 4人參與, 最新討論串1/1
最近在學著用lxml這個lib,在練習著分析一些網頁的資料。 我通常的用法都是先: root = lxml.html.parse('http://XXXXXXXXX').getroot() 之後再用xpath來分析。 但是抓到用big5 coding的網頁時,root.xpath裡面抓到所有中文字全部變成亂碼 (我的系統是用mac osx 下用 utf-8) 像是從root裡面抓出來的資料 "台塑" 兩個字: 用etree.tostring(root)的時候會得到一般字串: '¥x¶ì' 用root.xpath去撈出來的時候會變成unicode的字串: u'\xa5x\xb6\xec' print u'\xa5x\xb6\xec' 就會出現一堆亂碼 看起來好像是一開始在parse抓網頁資料的時候就弄錯編碼的樣子,所以之後 一連串得到的中文字現全部都混亂掉了...Orz... 想問一下有沒有什麼轉換的辦法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.76.181

07/25 14:02, , 1F
decode('big5')
07/25 14:02, 1F
會出現 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1 ※ 編輯: onionys 來自: 219.85.28.169 (07/25 18:03)

07/25 18:14, , 2F
encode('big5')
07/25 18:14, 2F
試了一下,同樣的程式在不同環境結果不太一樣...Orz... 簡易程式碼如下: ---------------------------------------------------------------------------- #!/usr/bin/python #-*- coding: utf8 -*- from lxml.html import parse def fromYahooStock(stoNum): qurl = 'http://tw.stock.yahoo.com/q/q?s=' + str(stoNum) root = parse(qurl).getroot() temp = root.xpath('/html/body/center/table/tr/td/table/tr/td/a')[0] print temp.text if __name__ == "__main__": fromYahooStock(1201) #還我味全龍~~~ ----------------------------------------------------------------------------- 字串為"1201味全",然後在下面兩個環境下跑的話.... 測試環境 OS: Mac OSX 10.6.8 python: 2.7.1 lxml: 2.2.8 得到結果: 出現亂碼... 得到的字串: u'1201\xa8\xfd\xa5\xfe' 解決方法: ...Orz...正在找... ---------------------------------------- OS: Debian 6 python: 2.6.6 lxml: python-lxml 2.2.8-2 得到結果: 一切正常... 得到的字串: u'1201\u5473\u5168' 解決方法: 一切正常... ※ 編輯: onionys 來自: 219.85.28.169 (07/25 19:10)

07/25 21:07, , 3F
decode('big5','ignore') ?
07/25 21:07, 3F

07/25 21:33, , 4F
encode('big5')和decode('big5')都會出現
07/25 21:33, 4F

07/25 21:34, , 5F
'ascii' codec can't encode characters in position...
07/25 21:34, 5F

07/25 21:51, , 6F
加了'ignore' 也會?
07/25 21:51, 6F

07/25 22:41, , 7F
加了'ignore',錯誤訊息就不會出現了,但是得到的字串
07/25 22:41, 7F

07/25 22:41, , 8F
變成了'1201\xa2D',print 出來也是個看不懂的字...orz..
07/25 22:41, 8F

07/29 13:50, , 9F
''.join([chr(ord(x)) for x in s]).decode('big5')
07/29 13:50, 9F

07/29 13:52, , 10F
s.encode('latin1').decode('big5')
07/29 13:52, 10F

07/30 01:15, , 11F
感謝樓上~~成功了~~~原來可以這樣處理~~
07/30 01:15, 11F
文章代碼(AID): #1EBGLtM9 (Python)