使用BeautifulSoup爬取数据时返回None/空列表问题求助
问题分析与解决方案
核心原因
- 动态内容渲染:该网站的课程列表是通过JavaScript动态加载的,
requests.get()只能获取页面初始的静态HTML,无法获取JS后续加载的内容,导致你要找的元素不在初始响应里。 - 动态类名:你使用的类名
AllCoursesMobile_course-filter-mobile__atbp2包含动态生成的哈希后缀(atbp2),这个后缀会随请求或页面更新变化,固定写死类名自然找不到元素。
解决方法
方法一:正则匹配类名(适配动态后缀)
如果目标元素的静态结构存在于初始响应中,可以用正则匹配类名的固定前缀部分:
from bs4 import BeautifulSoup as bs import requests import re s = requests.get('https://ineuron.ai/courses') soup = bs(s.text, 'html.parser') # 匹配类名以AllCoursesMobile_course-filter-mobile__开头的div t = soup.find('div', class_=re.compile(r'^AllCoursesMobile_course-filter-mobile__')) print(t)
方法二:Selenium模拟浏览器加载动态内容
Selenium可以模拟完整的浏览器渲染过程,获取JS加载后的页面内容:
from bs4 import BeautifulSoup as bs from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置无头浏览器模式 chrome_options = Options() chrome_options.add_argument('--headless=new') driver = webdriver.Chrome(options=chrome_options) driver.get('https://ineuron.ai/courses') # 等待页面加载完成(可根据实际情况调整等待时长) driver.implicitly_wait(10) soup = bs(driver.page_source, 'html.parser') t = soup.find('div', class_=re.compile(r'^AllCoursesMobile_course-filter-mobile__')) print(t) driver.quit()
方法三:抓取API接口直接获取数据
这是最高效的方式,通过浏览器开发者工具找到加载课程数据的接口:
- 打开浏览器开发者工具(F12),切换到「网络」标签。
- 刷新页面,筛选「XHR」或「Fetch」类型请求,找到返回课程列表的接口。
- 复制接口URL和请求参数,用
requests直接请求获取JSON格式的结构化数据。
内容的提问来源于stack exchange,提问作者Shivanshu Mall
相关产品推荐
相关产品推荐

