2015-09-26 40 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