使用BeautifulSoup爬取网页时目标a标签无法被识别获取求助
问题排查及解决步骤
第一步:先排查URL是否正确
你当前请求的URL是单个产品的详情页,而你要匹配的m_category-overview-tiles__item tile_product-standard是分类列表页的产品卡片类名,详情页本身不会存在这个元素,这是最可能导致返回None的原因。如果你的目标是爬取产品列表,需要先修改为对应分类的列表页URL再测试。
第二步:验证请求是否被反爬拦截
- 先打印返回状态码确认请求是否正常:
print(r.status_code),如果返回值不是200,说明请求被站点拦截 - 你当前使用的User-Agent版本过旧(Chrome 83是2020年的版本),很容易被反爬策略识别,建议替换为最新版浏览器的User-Agent,同时补全请求头的其他字段,示例如下:
headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7", "Referer": "https://www.stihl.fr/", "Upgrade-Insecure-Requests": "1" }
- 部分站点会校验请求Cookie,你可以先发起一次对站点首页的请求,拿到响应Cookie后再携带Cookie请求目标页面。
第三步:验证返回的HTML是否包含目标元素
将请求返回的内容保存为本地HTML文件,打开后直接搜索目标class名,如果搜索不到,说明目标元素是通过JavaScript动态渲染的,requests只能拿到初始静态HTML,无法获取JS生成的内容,两种解决方式:
- 抓接口获取数据:打开浏览器开发者工具的「网络」面板,筛选「XHR/ Fetch」请求,刷新页面后找到加载产品列表的后端接口,直接调用接口获取JSON格式的产品数据,效率远高于解析HTML
- 使用无头浏览器渲染页面:用Selenium、Playwright等工具模拟浏览器运行,等待JS执行完成、元素加载完成后再提取内容,示例Selenium代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("你的列表页URL") # 等待目标元素加载,最多等待10秒 link = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'a.m_category-overview-tiles__item.tile_product-standard')) ) print(link.get_attribute('href')) driver.quit()
第四步:优化元素选择逻辑
BeautifulSoup的class_参数是严格全匹配,如果目标元素的class属性还有其他值、或者空格顺序不对都会匹配失败,建议改用CSS选择器匹配,只要元素同时包含两个class即可命中:
link = soup.select_one('a.m_category-overview-tiles__item.tile_product-standard')
内容的提问来源于stack exchange,提问作者Moto Jero
相关产品推荐
相关产品推荐

