使用BeautifulSoup爬取Dealabs页面评论数时遭遇NoneType对象问题求助
解决BeautifulSoup获取评论数时返回None的问题
看起来你在爬取Dealabs页面评论数时遇到了元素定位失败的问题,我来帮你排查和解决:
首先,修复脚本里的明显错误
你的脚本里使用了requests.get()但没有导入requests模块,这会直接导致运行错误,先补上:
import requests
为什么会返回None?
主要有几个可能的原因:
- 页面结构更新:你依赖的
space--h-3 space--v-3这个class可能已经被网站修改了,导致BeautifulSoup找不到对应的元素。 - 链式调用的脆弱性:连续调用
find()时,只要中间某一步找不到元素,就会返回None,后续调用就会抛出异常。 - URL不一致:你问题里提到的目标URL是
https://www.dealabs.com/discussions/suivi-erreurs-de-prix-1063390?page=9999,但脚本里用的是带#comments的版本,可能获取的页面内容不符合预期。
改进后的解决方案
下面是更健壮的脚本,结合了两种获取评论数的方式(直接定位元素 + 正则匹配),同时添加了异常处理:
from bs4 import BeautifulSoup import requests import time import re while True: headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:117.0) Gecko/20100101 Firefox/117.0", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "DNT": "1", "Connection": "close", "Upgrade-Insecure-Requests": "1" } cookies = {"cookie_policy_agreement": "3"} # 使用你问题中指定的正确URL url = 'https://www.dealabs.com/discussions/suivi-erreurs-de-prix-1063390?page=9999' try: # 发送请求并检查状态码 response = requests.get(url, headers=headers, cookies=cookies) response.raise_for_status() # 如果请求失败(比如403、500),抛出异常 soup = BeautifulSoup(response.text, 'html.parser') # 方法1:用CSS选择器直接定位评论数元素(更直观) comment_elem = soup.select_one('#comments h2.flex--inline span.size--all-m') if comment_elem: comment_count = comment_elem.get_text(strip=True) print(f"成功获取评论数:{comment_count}") else: # 方法2:用正则表达式匹配页面中的评论数文本(更健壮,不受小结构变化影响) match_result = re.search(r'(\d+) commentaires', response.text) if match_result: comment_count = f"{match_result.group(1)} commentaires" print(f"成功获取评论数:{comment_count}") else: print("未找到评论数量相关内容,请检查页面结构或请求是否正常") except Exception as e: print(f"执行出错:{str(e)}") time.sleep(30)
关键改进点
- 添加异常处理:捕获请求错误和解析错误,避免脚本直接崩溃,方便排查问题。
- 双方案备份:先用CSS选择器定位元素,如果失败就用正则匹配文本,降低受页面结构变动的影响。
- 验证请求状态:用
response.raise_for_status()确保请求成功,避免解析错误的页面内容。 - 统一URL:使用你问题中指定的带
page=9999的URL,确保获取的是目标页面。
内容的提问来源于stack exchange,提问作者user19707890
相关产品推荐
相关产品推荐

