如何使用Beautiful Soup访问dl元素中的dt与dd节点?(欧洲央行新闻页面场景)
如何使用Beautiful Soup访问dl元素中的dt与dd节点?(欧洲央行新闻页面场景)
兄弟,我看你遇到的问题太典型了——明明找到了目标dl元素,却拿不到里面的dt和dd,这大概率是因为这个lazyload-container里的内容是JavaScript动态加载的!
咱们先理清楚:requests库只能抓取页面初始的静态HTML代码,而很多现代网站会用懒加载(比如滚动加载更多内容)或者异步请求来渲染页面内容,这些动态生成的元素,requests根本抓不到,所以你拿到的dl元素里面是空的或者只有占位符。
给你两个靠谱的解决方案,按需选择:
方案一:模拟浏览器渲染(用Selenium)
这种方法相当于让程序帮你打开浏览器,等页面完全加载(包括动态内容)后再抓取源码,完美解决动态加载问题。
步骤如下:
先安装Selenium和浏览器驱动:
pip install selenium同时要下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动版本和你的浏览器版本匹配。
改写你的代码:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options import time url = "https://www.ecb.europa.eu/press/pr/date/html/index.en.html" # 配置Chrome无头模式(不弹出浏览器窗口,适合服务器运行) chrome_options = Options() chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(options=chrome_options) # 打开页面并等待动态内容加载完成 driver.get(url) time.sleep(3) # 这里的等待时间可以根据实际加载速度调整,也可以用更智能的显式等待 # 获取完全加载后的页面源码 page_source = driver.page_source driver.quit() # 现在再用BeautifulSoup解析就能拿到完整内容了 soup = BeautifulSoup(page_source, "html.parser") main_wrapper_div = soup.find('div', {'id': 'main-wrapper'}) section_div = main_wrapper_div.find('dl', {'id': 'lazyload-container'}) # 终于能拿到dt和dd了! date_elements = section_div.find_all('dt') press_release_elements = section_div.find_all('dd') # 举个例子,打印前3条新闻的日期和链接 for date, pr in zip(date_elements[:3], press_release_elements[:3]): print(f"日期: {date.text.strip()}") link = pr.find('a')['href'] print(f"新闻链接: {link}\n")
方案二:直接请求数据接口(更高效)
模拟浏览器虽然简单,但速度慢、资源占用高。如果能找到网站加载数据的API接口,直接请求接口拿JSON数据会更高效。
你可以这样找接口:
- 打开浏览器的开发者工具(按F12),切换到「Network」标签
- 刷新页面,或者滚动加载更多内容,观察「XHR」或「Fetch」分类下的请求
- 找那些返回新闻列表的请求(比如URL里包含
press、pr、news这类关键词) - 找到后,直接用
requests请求这个接口,解析返回的JSON数据就能拿到所有日期和链接,连BeautifulSoup都省了!
小补充:如果是解析器的问题(概率低)
如果确认页面是静态的,但还是拿不到元素,可能是html.parser解析能力不足,可以换成lxml解析器试试:
- 先安装:
pip install lxml - 修改BeautifulSoup初始化代码:
soup = BeautifulSoup(response.content, "lxml")
备注:内容来源于stack exchange,提问作者Nerlo Fota
相关产品推荐
相关产品推荐

