作者onionys (..)
看板Python
標題[問題] 用lxml.html.parse 抓 big5 的html問題...
時間Mon Jul 25 13:56:04 2011
最近在學著用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
1F:→ suzuke:decode('big5') 07/25 14:02
會出現
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1
※ 編輯: onionys 來自: 219.85.28.169 (07/25 18:03)
2F:→ kenzou:encode('big5') 07/25 18:14
試了一下,同樣的程式在不同環境結果不太一樣...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)
3F:→ suzuke:decode('big5','ignore') ? 07/25 21:07
4F:→ onionys:encode('big5')和decode('big5')都會出現 07/25 21:33
5F:→ onionys:'ascii' codec can't encode characters in position... 07/25 21:34
6F:→ suzuke:加了'ignore' 也會? 07/25 21:51
7F:→ onionys:加了'ignore',錯誤訊息就不會出現了,但是得到的字串 07/25 22:41
8F:→ onionys:變成了'1201\xa2D',print 出來也是個看不懂的字...orz.. 07/25 22:41
9F:→ scp958630:''.join([chr(ord(x)) for x in s]).decode('big5') 07/29 13:50
10F:→ scp958630:s.encode('latin1').decode('big5') 07/29 13:52
11F:→ onionys:感謝樓上~~成功了~~~原來可以這樣處理~~ 07/30 01:15