python中的NoneType

时间:2015-09-26 16:42:24

标签: python beautifulsoup

我试图从Tripadvisor获取一些评分数据但是当我试图获取我正在获取的数据时

  

'NoneType'对象不可订阅

任何人都可以帮我弄清楚我哪里出错了,对不起我对python很新。

这是我的示例代码

import requests
import re
from bs4 import BeautifulSoup
r = requests.get('http://www.tripadvisor.in/Hotels-g186338-London_England-Hotels.html')
data = r.text        
soup = BeautifulSoup(data)
for rate in soup.find_all('div',{"class":"rating"}):
               print (rate.img['alt'])

输出结果如下:

4.5 of 5 stars
4.5 of 5 stars 4 of 5 stars
4.5 of 5 stars
4.5 of 5 stars 4 of 5 stars
4.5 of 5 stars
4.5 of 5 stars
4.5 of 5 stars Traceback (most recent call last):

  File "<ipython-input-52-7460e8bfcb82>", line 3, in <module>
    print (rate.img['alt'])

TypeError: 'NoneType' object is not subscriptable

2 个答案:

答案 0 :(得分:5)

并非所有<div class="rating">代码都有<img />代码,因此rate.imgNone

这些div看起来像这样:

<div class="rating">
  <span class="rate">4.5 out of 5, </span>
  <em>2,294 Reviews</em>
  <br/>
  <div class="posted">Last reviewed 25 Sep 2015</div>
</div>

你可以测试一下:

if rate.img is not None:
    # ...

或仅选择带有CSS selectordiv.rating标签下的图片:

for img in soup.select('div.rating img[alt]'):

此处的选择器会选择<img/>alt标记,并嵌套在<div class="rating">标记内。

答案 1 :(得分:2)

这意味着,并非所有divrating都拥有alt属性的图片。你应该适当地处理这个问题 - 忽略这种情况,只需将你的print (rate.img['alt'])包裹起来试试,除了阻止,或者先查看rate.img是否None

第一个选项:

try:
    print(rate.img['alt'])
except TypeError:
    print('Rating error')

第二个选项:

for rate in soup.find_all('div',{"class":"rating"}):
    if rate.img is not None:
        print (rate.img['alt'])

第一个选项遵循EAFP(更容易请求宽恕而非许可),一种常见的Python编码风格,而第二个选项跟随LBYL(在您跳跃之前看)。在这种情况下,我建议第二个。