爬取亚马逊印度笔记本页面时遇'NoneType'无'text'属性错误求解
亚马逊印度站笔记本爬取:解决AttributeError及正确提取价格、评分的方法
爬取亚马逊印度站笔记本搜索页时,出现了AttributeError: 'NoneType' object has no attribute 'text'错误。
我的代码:
headers = ({'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0', 'Accept-Language' : 'en-US,en;q=0.5'}) lap_site = requests.get('https://www.amazon.in/s?k=laptops&sprefix=%2Caps%2C634&ref=nb_sb_ss_recent_3_0_recent',headers = headers) lap_soup = bs(lap_site.content,'lxml') content = lap_soup.find('div',class_ = 's-desktop-width-max s-desktop-content s-opposite-dir sg-row') lap_detail_block = content.find_all('div',class_ = 'a-section a-spacing-small a-spacing-top-small') lap_name = lap_price = lap_rating = [] for i in lap_detail_block: laptop_name = i.find('h2').a.span.text lap_name.append(laptop_name) laptop_rating = i.find('span',class_ = 'a-icon-alt').text lap_rating.append(laptop_rating) laptop_price = i.find('span',class_ = 'a-price-whole').text lap_price.append(laptop_price) laptop_details = { 'Laptop':lap_name, 'Price':lap_price, 'Rating':lap_rating } print(laptop_details)
我猜测laptop_rating变量即使不加.text也会以字符串格式存储内容,可能因此导致NoneType错误,但这并非核心问题,想请教如何从该链接中正确提取价格和评分?
问题核心
错误根源是部分商品没有评分或价格元素,当find()找不到对应元素时返回None,直接调用.text就会触发报错。另外你依赖的页面类名可能已失效,导致定位不到正确的商品容器。
修复方案
- 增加空值判断:对每个查找结果做校验,避免直接调用
.text - 更换稳定选择器:用商品卡片的
data-component-type属性定位,比类名更不容易变
修复后的代码:
import requests from bs4 import BeautifulSoup as bs headers = ({'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0', 'Accept-Language' : 'en-US,en;q=0.5'}) lap_site = requests.get('https://www.amazon.in/s?k=laptops&sprefix=%2Caps%2C634&ref=nb_sb_ss_recent_3_0_recent', headers=headers) lap_soup = bs(lap_site.content, 'lxml') # 定位每个商品卡片,使用更稳定的属性选择器 lap_detail_block = lap_soup.find_all('div', {'data-component-type': 's-search-result'}) lap_name = [] lap_price = [] lap_rating = [] for item in lap_detail_block: # 提取商品名称,处理空值 name_tag = item.find('h2', class_='a-size-mini a-spacing-none a-color-base s-line-clamp-2') laptop_name = name_tag.get_text(strip=True) if name_tag else '无名称' lap_name.append(laptop_name) # 提取评分,处理空值 rating_tag = item.find('span', class_='a-icon-alt') laptop_rating = rating_tag.get_text(strip=True) if rating_tag else '无评分' lap_rating.append(laptop_rating) # 提取价格,处理空值 price_tag = item.find('span', class_='a-price-whole') laptop_price = price_tag.get_text(strip=True) if price_tag else '无价格' lap_price.append(laptop_price) laptop_details = { 'Laptop': lap_name, 'Price': lap_price, 'Rating': lap_rating } # 格式化输出结果 for idx, name in enumerate(laptop_details['Laptop']): print(f"商品 {idx+1}") print(f"名称: {name}") print(f"价格: {laptop_details['Price'][idx]}") print(f"评分: {laptop_details['Rating'][idx]}") print("-" * 50)
额外提醒
- 亚马逊反爬严格,建议添加请求间隔(如
import time; time.sleep(2)),避免被封IP - 页面结构可能随时更新,定期检查选择器有效性
- 使用
get_text(strip=True)可自动去除文本中的多余空格和换行
内容的提问来源于stack exchange,提问作者SuryaTeja Masapogu
相关产品推荐
相关产品推荐

