Beautifulsoup extracking属性TypeError:'NoneType'对象不可迭代

时间:2017-10-12 00:01:03

标签: python beautifulsoup python-3.6

我曾经通过此

获取标签属性
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>

我一直在寻找解决方案,但到目前为止,他们都没有为我工作。

2 个答案:

答案 0 :(得分:0)

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

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

使用&#34; span&#34;检查它找到的第一件事,如果这不包含标题标记,则会抛出异常。

e.g。上

<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 :(得分:0)

这个非常不清楚的问题已经过去了三年,直到今天我还是以某种方式忘记了它。我看到这个问题已经传到了很多人,我想提供我认为可以绝对解决您代码中问题的输入。

不幸的是,我不记得我的代码存在的问题,而且我写的所有东西都还不清楚。但是,我确实有一些想法可能是造成问题的原因。这是我对您的建议。

1。仔细阅读文档:

BeaututifulSoup有一个非常好的书面文档,如果您不知道如何使用选择器并寻找一个懒惰的答案,就像我一样,我强烈建议您看一下位于此处的BS4文档:{{3 }}(特别是将选择器视为由于滥用CSS选择器而引起的最多问题)。与其花5分钟寻找答案,不如花10分钟学习它的工作原理。我向您保证,这将对您更加有益。

2。确保您拥有正确的对象

通过运行print(dir(your_object)),您可以看到对象可以运行的所有方法。此外,每当您遇到困难时,请尝试调试代码并尝试查找错误。当时我在使用IDLE编辑器,但是最近我意识到VS Code具有内置的https://www.crummy.com/software/BeautifulSoup/bs4/doc/#,它非常有用,并且可以并且将在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>

这很可能是导致问题的原因,但我想指出的是,我在<span>变量中寻找一个line元素,这很可能是列表中包含以下内容的元素一个循环迭代。在这种情况下,由于并非所有人都拥有<span>元素,因此程序可能会崩溃。最好的办法是将导致问题的代码部分放在这样的try-except块中

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

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

如果您按照我上面提到的方法进行工作,我将百分百确定您将解决所遇到的任何问题,此外,它们还是您应具备的良好工程实践。特别感谢@Friedrich Staufenbiel和@matusf的关注。