使用BeautifulSoup的get_text()提取评分时,div无文本触发AttributeError求助
解决BeautifulSoup提取评分时的AttributeError问题
嘿,这个问题我之前也踩过坑!当box.find(class_='hGSR34')找不到对应元素时,它会返回None,这时候再强行调用.get_text()自然就触发AttributeError了。咱们可以用几种简单的方式来处理这种情况,让代码更健壮:
方法1:先检查元素是否存在再提取文本
最直观的思路就是先判断找到的元素是不是None,再决定要不要提取文本:
import requests from bs4 import BeautifulSoup page = requests.get('https://www.flipkart.com/exercise-fitness/fitness-equipment/home-gym-combos/pr?sid=qoc,amf,pz0&q=gym+equipments+combo+50+kg&otracker=categorytree') soup = BeautifulSoup(page.content, 'html.parser') container = soup.find('div', class_='t-0M7P _2doH3V') boxes = container.find_all('div', class_="_3liAhj") for box in boxes: title = box.find(class_='_2cLu-l').get_text() print(title) # 先获取评分元素,再判断是否存在 rating_elem = box.find(class_='hGSR34') rating = rating_elem.get_text() if rating_elem else "无评分" print(rating) price = box.find(class_='_1vC4OE').get_text() print(price) print()
方法2:用get_text()的默认参数(BeautifulSoup 4.9.0+支持)
如果你的BeautifulSoup版本是4.9.0及以上,可以直接用更简洁的写法——给get_text()传一个默认值,这样即使元素不存在也不会报错:
rating = box.find(class_='hGSR34').get_text(default="无评分")
这个写法本质和方法1逻辑一致,只是把判断逻辑封装到了get_text()方法里,代码更清爽。
方法3:用try-except捕获异常
要是你不确定还有哪些元素可能找不到,用异常捕获的方式会更灵活:
try: rating = box.find(class_='hGSR34').get_text() except AttributeError: rating = "无评分" print(rating)
这种方式能兜底处理各种意外的AttributeError场景。
另外悄悄说一句:你获取title和price的时候也可能遇到同样的问题哦,如果某个商品没有标题或价格,代码照样会报错,建议也用类似的方式处理一下,让整个爬虫更稳~
内容的提问来源于stack exchange,提问作者Jobindev25
相关产品推荐
相关产品推荐

