目标
我有一个包含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
方法
由于代码确实运行良好,否则我没有包括其余部分,但如果有人怀疑它可能来自其他地方,有充分理由,那么我将添加更多代码。
我已经检查了.txt文件的内容以查找那些有用的内容和那些失败的内容以及xpath在两者中都有效,内容 可以找到并解析它们。
我在相同文件的30个副本上使用了代码,这些副本确实成功执行,因此HTML代码中必须存在细微差别,我的解析器无法识别。
答案 0 :(得分:0)
TypeError: 'NoneType' object has no attribute '__getitem__'
表示您尝试在mylist[2]
上使用某种索引,例如None
,而不是list
之类的索引。这意味着对该对象__getitem__
的内部调用失败,因为None
是Nonetype
类型的对象,并没有为此定义的方法它
问题出在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]