You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Beautiful Soup访问dl元素中的dt与dd节点?(欧洲央行新闻页面场景)

如何使用Beautiful Soup访问dl元素中的dt与dd节点?(欧洲央行新闻页面场景)

兄弟,我看你遇到的问题太典型了——明明找到了目标dl元素,却拿不到里面的dt和dd,这大概率是因为这个lazyload-container里的内容是JavaScript动态加载的!

咱们先理清楚:requests库只能抓取页面初始的静态HTML代码,而很多现代网站会用懒加载(比如滚动加载更多内容)或者异步请求来渲染页面内容,这些动态生成的元素,requests根本抓不到,所以你拿到的dl元素里面是空的或者只有占位符。

给你两个靠谱的解决方案,按需选择:

方案一:模拟浏览器渲染(用Selenium)

这种方法相当于让程序帮你打开浏览器,等页面完全加载(包括动态内容)后再抓取源码,完美解决动态加载问题。

步骤如下:

  1. 先安装Selenium和浏览器驱动:

    pip install selenium
    

    同时要下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动版本和你的浏览器版本匹配。

  2. 改写你的代码:

    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数据会更高效。

你可以这样找接口:

  1. 打开浏览器的开发者工具(按F12),切换到「Network」标签
  2. 刷新页面,或者滚动加载更多内容,观察「XHR」或「Fetch」分类下的请求
  3. 找那些返回新闻列表的请求(比如URL里包含press、pr、news这类关键词)
  4. 找到后,直接用requests请求这个接口,解析返回的JSON数据就能拿到所有日期和链接,连BeautifulSoup都省了!

小补充:如果是解析器的问题(概率低)

如果确认页面是静态的,但还是拿不到元素,可能是html.parser解析能力不足,可以换成lxml解析器试试:

  1. 先安装:pip install lxml
  2. 修改BeautifulSoup初始化代码:
    soup = BeautifulSoup(response.content, "lxml")
    

备注:内容来源于stack exchange,提问作者Nerlo Fota

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:19:08