美丽汤 extracking 属性类型错误:"NoneType"对象不可迭代



我曾经通过这个获取标签属性

for a in soup.find_all('img', {'data-event': 'Clicked image'}, 
src=True,alt=True):
itemobj = a['src'] + ' --- ' + a['alt']

现在我在另一个网站上工作,当我尝试这个时,它抛出了TypeError:"NoneType"对象是不可迭代的

song_link = line.find('td').find('a')['href'] (This works well)
sss = line.find('span')['title'] (This in not working. But when I delete ['title'] part it works and shows inside of the <span> tag

我的数据:

<span class="rating" title="4.5">
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__half"></span>
</span>

我一直在寻找这个问题的解决方案,但到目前为止,没有一个对我有效

当我在你提供的数据上尝试你的代码时,它对我来说很好,所以我假设还有更多的数据。

soup.find('span')['title']

用"span"检查它找到的第一个东西,如果它不包含title标记,就会抛出异常。

例如在上

<span></span>
<span class="rating" title="4.5">
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__half"></span>
</span>

代码不起作用。

至少这是发生在我身上的几次。

这个极其不清楚的问题已经过去了将近三年,直到今天我都不知怎么忘记了。我看到很多人都提出了这个问题,我想提供我的意见,我相信肯定可以解决您代码中的问题。

不幸的是,我不记得我的代码有什么问题,我写的所有东西都很不清楚。然而,我确实有几个想法可能是什么导致了这个问题。这是我给你的建议。

1.仔细阅读文档:

BeauttutifulSoup有一个写得很好的文档,如果你不知道如何使用选择器并像我一样寻找懒惰的答案,我强烈建议你看看这里的BS4文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#(特别是将选择器视为滥用CSS选择器造成的最大问题)。与其花5分钟寻找答案,不如花10分钟学习它的工作原理。我向你保证,这将对你更有益处。

2.确保您有正确的对象

通过运行print(dir(your_object)),您可以看到对象可以运行的所有方法。此外,无论何时遇到问题,都要尝试调试代码并找出错误。当时我使用IDLE编辑器,但最近我意识到VS Code有一个内置的Python调试器,它非常有用,它可以而且将在99%的时间内解决您的问题。

3.确保您得到了正确的项目

正如@Friedrich Staufenbiel所指出的,我的数据很可能包含了一个额外的<span>元素,就像下面一样

<span></span>
<span class="rating" title="4.5">
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__active"></span>
<span class="icon-rating-sm icon-rating-sm__half"></span>
</span>

这很可能是导致问题的原因。然而,我想指出的是,我正在line变量中寻找一个<span>元素,它很可能是带有for a循环迭代的列表的元素。在这种情况下,预计程序会崩溃,因为并非所有程序都具有<span>元素。你能做的最好的事情是把导致问题的代码部分放在像这个这样的try-except块中

try:
sss = line.find('span')['title']
except Exception as e:
print(e)

至少通过这种方式,你可以找到导致程序崩溃的代码部分,并将错误消息提供给其他人,以便他们能更好地帮助你。

我100%相信,如果你遵循我上面提到的东西,你会解决你遇到的任何问题,而且它们是好的工程实践,无论如何你都应该拥有。特别感谢@Friedrich Staufenbiel和@matusf的友好关注。

最新更新