如何用BeautifulSoup提取div内h3标签文本?提取100) Reservoir Dogs失败
解决方法
问题原因
- 目标网站的电影列表是通过JavaScript动态渲染的,
requests只能获取到初始的静态HTML,无法获取JS加载后的内容,所以找不到目标元素。 - 代码中使用的
jsx-4245974604是React生成的动态类名,类名可能会随页面更新或请求变化,无法稳定定位元素。
方案一:使用Selenium获取动态内容
Selenium可以模拟浏览器打开页面,等待JS渲染完成后再提取内容。
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 url = "https://www.empireonline.com/movies/features/best-movies-2/" # 初始化Chrome浏览器(需提前下载对应版本的ChromeDriver) driver = webdriver.Chrome() driver.get(url) # 等待目标元素加载完成,最多等待10秒 try: # 通过文本内容定位元素,避免依赖动态类名 target_movie = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//h3[contains(text(), '100) Reservoir Dogs')]")) ) print(target_movie.text) finally: driver.quit()
方案二:直接请求API接口(更高效)
打开浏览器开发者工具的「网络」面板,刷新页面后筛选XHR/fetch请求,可找到返回电影列表的API接口,直接请求接口获取数据,无需处理页面渲染。
示例(需自行查找实际API接口):
import requests # 替换为实际找到的API接口URL api_url = "目标网站的电影列表API接口" response = requests.get(api_url) movie_data = response.json() # 遍历数据找到目标电影 for item in movie_data: if "100) Reservoir Dogs" in item.get("title", ""): print(item["title"]) break
注意事项
- 使用Selenium时,需确保浏览器驱动版本与本地浏览器版本匹配。
- 动态生成的类名不适合作为定位元素的依据,优先使用文本、固定属性或XPath表达式定位。
内容的提问来源于stack exchange,提问作者Asharib Hussain
相关产品推荐
相关产品推荐

