作者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