我试图从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
答案 0 :(得分:5)
并非所有<div class="rating">
代码都有<img />
代码,因此rate.img
为None
。
这些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 selector的div.rating
标签下的图片:
for img in soup.select('div.rating img[alt]'):
此处的选择器会选择<img/>
个alt
标记,并嵌套在<div class="rating">
标记内。
答案 1 :(得分:2)
这意味着,并非所有div
类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(在您跳跃之前看)。在这种情况下,我建议第二个。