Why might Python break down halfway through a loop? TypeError: __getitem__

Why might Python break down halfway through a loop? TypeError: __getitem__

目标

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

问题

我收到:

TypeError: 'NoneType' object has no attribute '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_values。所有这一切都只是 运行 在一个更大的循环中,文件被读入 parse 函数,然后输出被写入一个新文件。

我试过的

我已经删除了最初出现错误的文件,但在下一个文件中出现了同样的错误。我又做了同样的事情,删除了两个文件,但仍然出现该错误。

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

根据the documentation,当一个函数被应用到一个不合适类型的对象上时,就会出现TypeError,那么它怎么会在正确运行10次或11次后出现呢? 这是关于 __getitem__ 方法

的更官方 information

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

我已经检查了 .txt 文件的内容,找出那些有效的和失败的,xpath 在这两个文件中都有效, 的内容可以找到并解析.

我在同一个文件的 30 个副本上使用了代码,它们确实执行成功,所以 HTML 代码中肯定存在细微差别,我的解析器无法识别。

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

问题出在x.get('title')[8:]get()方法在x中没有找到任何名为'title'的键,因此它返回了None。但是,您随后尝试使用 [8:] 对其进行切片。如果它返回了一个 list 或类似的对象,它会工作正常,但对于 None.

则不然

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

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

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

x.get('title') 返回 None

如果要过滤列表理解,不重复查询,可以从查询结果构建单项列表,如果是 None:

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