从Python中的HTML元素解析unicode字符

时间:2013-11-12 13:54:01

标签: python unicode html-parsing lxml

我有以下代码来解析HTML网站。这将返回一个HTML元素对象。我想在几台机器上运行此代码,因此当有人试图从代理服务器后面运行代理时,实现代理非常重要。

from lxml.html import parse

def parsepage(url):
if proxy:
    proxy_support = urllib2.ProxyHandler({"http":proxy})
    opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler)
    urllib2.install_opener(opener)
    conn = urllib2.urlopen(url)
    site = parse(conn).getroot()
else:
    site = parse(url).getroot()
return site

在返回HTML元素后,我通过使用如下的Xpath表达式从对象获取数据:

element = site.xpath(expression)

问题是结果包含非unicode数据,其中包含转义字符。例如:

  

\ xe1ci \ xf3s kombi

我也试过了这个实现,但这个给了我一个错误:

def parsepage(url):
if proxy:
    proxy_support = urllib2.ProxyHandler({"http":proxy})
    opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler)
    urllib2.install_opener(opener)
    conn = urllib2.urlopen(url)
    rawdata = conn.read()
    parser = etree.HTMLParser(encoding="utf-8")
    site = etree.HTML(rawdata, parser=parser)
else:
    site = parse(url).getroot()
return site

错误信息是:

  

'utf8'解码不能解码位置4中的字节0xf3:无效的连续字节

该网站正在使用iso-8859-2字符集。

有没有办法使用上面列出的解析方法之一将非unicode字符转换为unicode?或者我可能出错了,我正在以正确的格式获取数据但是我的表示有问题。

我应该使用lxml.fromstring来使用编码参数吗?

谢谢, g0m3z

解决方案:

实际上我的代码没有问题,但是数据的表示。第一个代码实现工作正常。

我将结果加载到字典中,当我一次打印整个字典时,它会错误地显示unicode字符。但是,如果我只根据一个键打印结果字典中的一个项目,它就会正确表示unicode字符。所以它有效!有趣。感谢网络上的每个人提供宝贵的意见!

2 个答案:

答案 0 :(得分:0)

您应该从HTTP标头(或HTML-meta-tags)中读取实际字符编码,而不是猜测它。这样就可以避免解码错误。

答案 1 :(得分:0)

您可以尝试使用库来解析请求。我推荐你BeautifulSoup。这将处理编码的所有问题,并且非常容易使用它。