我有以下代码来解析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字符。所以它有效!有趣。感谢网络上的每个人提供宝贵的意见!
答案 0 :(得分:0)
您应该从HTTP标头(或HTML-meta-tags)中读取实际字符编码,而不是猜测它。这样就可以避免解码错误。
答案 1 :(得分:0)
您可以尝试使用库来解析请求。我推荐你BeautifulSoup。这将处理编码的所有问题,并且非常容易使用它。