我曾经通过这个获取标签属性
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的友好关注。