Python lxml树头和其他一些元素断裂

Python lxml树头和其他一些元素断裂,python,web-scraping,lxml,Python,Web Scraping,Lxml,我为下面的问题尝试了许多不同的解决方案,但目前找不到有效的解决方案。 我需要从几个网页的元标签中获取一些信息。为此,我发现lxml非常有用,因为我还需要使用xpath来解析特定内容。XPath在树上工作,但是,我有20%的网站(总共大约100个)不工作,特别是头部似乎坏了 tree = html.fromstring(htmlfrompage) // using html from lxml package head_object = tree.head // ac

我为下面的问题尝试了许多不同的解决方案,但目前找不到有效的解决方案。 我需要从几个网页的元标签中获取一些信息。为此,我发现lxml非常有用,因为我还需要使用xpath来解析特定内容。XPath在树上工作,但是,我有20%的网站(总共大约100个)不工作,特别是头部似乎坏了

tree = html.fromstring(htmlfrompage)  // using html from lxml package
head_object = tree.head               // access to head object from this webpage
在所有这些网站中,访问head对象(这只是xpath的快捷方式)失败,并出现相同的错误:

print tree.head
IndexError: list index out of range
因为以下xpath失败:

self.xpath('//head|//x:head', namespaces={'x':XHTML_NAMESPACE})[0]
此xpath为空,因此访问第一个元素失败。我自己在树中导航,self.xpath(“//head”)或self.xpath(“//html/head”)甚至self.xpath(“//body”)都是空的。但如果我尝试直接在文档的任何位置访问元标记:

head = tree.xpath("//meta")
for meta_tag in head:
    print meta_tag.text  # Just printing something
它是有效的,所以它意味着某种程度上Meta没有连接到头部,但它们在树上的某个地方浮动。头根本不存在。当然,我可以尝试在访问head时“修补”这个问题,如果我得到一个索引超出范围的异常,我可以导航metas来查找我要查找的内容,但我希望lxml能够修复损坏的html(正如我在文档中读到的)


有没有人有相同的问题,可以用更好的方法解决它?

使用
请求
我可以很好地加载树:

>>> import requests
>>> from lxml import html
>>> r = requests.get('http://www.lanacion.com.ar/1694725-ciccone-manana-debera-declarar-carosso-donatiello-el-inquilino-de-boudou')
>>> tree = html.fromstring(r.content)
>>> tree.head
<Element head at 0x10681b4c8>
这意味着
r.text
将使用拉丁语-1对UTF-8数据进行解码,从而导致Unicode字符串解码错误,进一步混淆问题

另一方面,HTML解析器可以利用当前的
头告诉它要使用什么编码:

>>> tree.find('.//meta').attrib
{'content': 'text/html; charset=utf-8', 'http-equiv': 'Content-Type'}

你能给我们举一个这样一个网站的例子,这样我们就可以复制并提出解决方案吗?当然,这就是一个例子。看起来您的本地LXML设置是b0rken。这个链接对我来说很好。这可能是因为您系统上的
libxml2
版本已经过时。因此,如果您得到tree.head,它可以正常工作吗?我要检查我的lib版本,我得到该文档的
tree.head
,没问题。
>>> tree.find('.//meta').attrib
{'content': 'text/html; charset=utf-8', 'http-equiv': 'Content-Type'}