为什么Python可能会在循环中途中断? TypeError:__ getitem __

时间:2015-09-28 23:09:45

标签: python python-2.7 loops nonetype

目标

我有一个包含65个.txt文件的目录,我将逐个解析,并将输出保存到65个相应的.txt文件中。然后我计划连接它们,但我不确定是否直接跳到那可能有助于在这里找到解决方案。

问题

我收到了:

  

TypeError:'NoneType'对象没有属性' getitem '

并且已经看到两个相似的主题:

TypeError: 'NoneType' object has no attribute '__getitem__'

Python: TypeError: 'NoneType' object has no attribute '__getitem__'

然而,我的问题似乎有些奇怪,因为它管理来浏览输入文件,解析它们并将输出文件写入大约十次,此时我得到了错误。这些文件都是相似的,只是来自网站的HTML源代码(即同一个网站,只是它的不同页面,因此基本的HTML结构相同)。

这是发生错误的功能;在这个片段的最后一行:

def parse(elTree):
    desired_value = elTree.xpath('my_very_long_xpath')
    desired_value = [x.get('title')[8:] for x in desired_value]

我还有其他一些变体 - 我实际上正在解析大约5到6个不同的desired_value。所有这些只是在一个较大的循环内运行,其中文件被读入parse函数,然后输出被写入一个新文件。

我尝试了什么

我删除了我最初收到错误的文件,但是在下一个文件中发生了同样的错误。我再次做了同样的事情,删除了两个文件,但仍然收到了这个错误。

我在每个文件之间引入了time.sleep(3),只是为了让事情可以更顺畅地运行。我意识到整个过程可能有一个缓冲区,可能正在被读取而且它正在被擦除,所以那里没有文件......这里有{{1}的循环中的类似occurrence }}。不幸的是,睡了3秒钟(加上其他各点分散了)并没有帮助我。代码在完全相同的位置失败。

根据the documentation,当函数应用于不适当类型的对象时会出现C,那么在正常运行10或11次后它是如何发生的呢? 关于TypeError方法

,这是更正式的information

由于代码确实运行良好,否则我没有包括其余部分,但如果有人怀疑它可能来自其他地方,有充分理由,那么我将添加更多代码。

我已经检查了.txt文件的内容以查找那些有用的内容和那些失败的内容以及xpath在两者中都有效,内容 可以找到并解析它们。

我在相同文件的30个副本上使用了代码,这些副本确实成功执行,因此HTML代码中必须存在细微差别,我的解析器无法识别。

2 个答案:

答案 0 :(得分:0)

TypeError: 'NoneType' object has no attribute '__getitem__'表示您尝试在mylist[2]上使用某种索引,例如None,而不是list之类的索引。这意味着对该对象__getitem__的内部调用失败,因为NoneNonetype类型的对象,并没有为此定义的方法它

问题出在x.get('title')[8:]get()方法在'title'中找不到任何名为x的密钥,因此它返回None。但是,您尝试使用[8:]对其进行切片。如果它返回了list或类似的对象,它可以正常工作,但None则不行。

我建议引入某种错误处理:

try:
    desired_value = [x.get('title')[8:] for x in desired_value]
except TypeError:
    return

您必须更正并展开此存根,以使其以适合您的程序的方式运行。也许您需要定义某种默认return或其他内容,而不是desired_value语句。

答案 1 :(得分:0)

x.get('title')正在返回None

如果要过滤列表推导而不重复查询,可以从查询结果中构建单个项目列表,如果它是None,则对其进行过滤:

desired_value = [title[8:] for x in desired_value
                 for title in [x.get('title')]
                 if title]