2015-09-26 21 views
-1

,我试图从Tripadvisor得到一些评价数据,但我试图获取我渐渐NoneType在python

数据

“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 
+1

'rate.img is None' ... – jonrsharpe

+0

这意味着在您的至少一个'rate' div下没有''标签。 –

回答

3

并不是所有的<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: 
    # ... 

,或者选择下div.rating标签仅适用于图像与CSS selector

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

这里的选择器选择<img/>标签一个alt属性,嵌套在<div class="rating">标记中。

+0

啊,我错过了,谢谢,不是无条件帮助:) – PSraj

2

这意味着并不是所有div s的一类rating有一个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 (三思而后行)。在这种情况下,我会建议第二个。

+0

感谢您的回应,确实是由于一些无情况。 – PSraj