使用lxml和xpath时出现奇怪的python错误

时间:2012-07-11 07:11:20

标签: python xpath lxml

我正在使用python编写一个爬虫,因为我需要解析html所以我导入lxml但它出现了一个奇怪的错误:

<type 'dict'>
{'xpath': '//ul[@id="i-detail"]/li[1]', 'name': u'\u6807\u9898'}

<type 'dict'>
{'xpath': '//ul[@id="i-detail"]/li[1]', 'name': u'\u6807\u9898'}

<type 'dict'>   
{'xpath': '//ul[@id="i-detail"]/li[1]', 'name': u'\u6807\u9898'}
Exception in thread Thread-3:
Traceback (most recent call last):
  File     "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line     522, in __bootstrap_inner
    self.run()
  File     "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line     477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "fetcher.py", line 78, in run
    self.extractContent(html)
  File "fetcher.py", line 151, in extractContent
    m = tree.xpath(c['xpath'])
AttributeError: 'NoneType' object has no attribute 'xpath'

<type 'dict'>
{'xpath': '//ul[@id="i-detail"]/li[1]', 'name': u'\u6807\u9898'}

这是我的一段代码:

for c in self.contents:
  print type(c)
  print c
  m = tree.xpath(c['xpath'])

请帮我解决这两个问题:

  1. 为什么类型为dict,但错误显示为NoneType?

  2. 我想要匹配“树”中的内容,但它不起作用(网站是用GBK编码的,编码类型是否会导致这类问题?)。

    < / LI>

2 个答案:

答案 0 :(得分:1)

  1. 您收到AttributeError,这意味着tree没有xpath属性,因为它已成为None,而不是c没有xpath密钥,而是KeyError代替。

    显然我们在这里缺少一些代码,其中tree设置为“无”。

  2. 您没有打印tree.xpath()来电的结果,因此您的代码中没有任何内容(与我们分享)打印m。对于我们所知道的人来说,tree.xpath()电话可以正常工作。

  3. 在行间读取并推测一点,您将tree.xpath()的结果分配回tree,并且您的XPath表达式没有匹配任何内容并返回None。下次进入循环时,您现在拥有None而不是ElementTreeNode,因此xpath()调用失败并显示AttributeError

答案 1 :(得分:0)

对于您的第一个问题,错误告诉您tree为无,因为您正在尝试阅读xpath属性。但您打印的是c类型,而不是tree

我无法理解你提出的第二个问题。