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

求助:使用Python BeautifulSoup抓取EUDamed平台树状列表数据

抓取欧盟EUDamed平台树状列表数据的解决方案

EUDamed平台的树状列表是通过JavaScript动态渲染的,直接用requests+BeautifulSoup请求静态HTML页面拿不到目标数据——数据是页面加载后通过异步请求获取并渲染的。下面提供两种可行的抓取方案:

方案一:使用Selenium模拟浏览器渲染(适合新手直观操作)

这种方法模拟真实浏览器打开页面,等待动态内容加载完成后再提取数据:

  1. 安装依赖:
pip install selenium beautifulsoup4

同时下载对应浏览器的WebDriver(比如ChromeDriver,需和浏览器版本匹配),配置到系统PATH或在代码中指定路径。

  1. 示例代码:
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
from bs4 import BeautifulSoup
import time

# 初始化Chrome驱动,其他浏览器需对应调整
driver = webdriver.Chrome()
try:
    # 打开目标页面
    driver.get("https://ec.europa.eu/tools/eudamed/#/screen/nomenclatures")
    
    # 等待树状列表核心元素加载(需通过浏览器开发者工具确认实际元素选择器,示例用tree-node作为占位)
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "tree-node"))
    )
    # 预留时间确保所有节点加载完成
    time.sleep(2)
    
    # 获取渲染后的页面HTML
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, "html.parser")
    
    # 提取树状节点数据,根据实际DOM结构调整选择器
    tree_nodes = soup.find_all(class_="tree-node")
    for node in tree_nodes:
        node_text = node.get_text(strip=True)
        print(node_text)
        
finally:
    # 关闭浏览器
    driver.quit()

提示:需通过浏览器F12开发者工具查看树状节点的真实class或标签,替换代码中的tree-node选择器。

方案二:直接抓取后台API(更高效,推荐)

通过浏览器开发者工具找到加载树状数据的API接口,直接请求获取原始JSON数据,无需渲染页面:

  1. 定位API接口:
    打开目标页面按F12,切换到「网络」面板,刷新页面后筛选「XHR/Fetch」请求,找到返回树状结构数据的接口(通常路径包含nomenclatures或tree关键词)。

  2. 示例代码(需替换为实际API地址):

import requests

# 替换为实际找到的API接口URL
api_url = "https://ec.europa.eu/tools/eudamed/api/nomenclatures/tree"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

response = requests.get(api_url, headers=headers)
if response.status_code == 200:
    # 解析JSON并递归遍历树状结构(根据API返回的字段调整逻辑)
    tree_data = response.json()
    def traverse_tree(node):
        print(node.get("name"))  # 假设节点名称字段为name
        if "children" in node and node["children"]:
            for child in node["children"]:
                traverse_tree(child)
    
    traverse_tree(tree_data)
else:
    print(f"请求失败,状态码:{response.status_code}")

提示:若请求被拒绝,需检查接口的请求头(如Cookie、Authorization),确保和浏览器请求一致。

新手注意事项

  • 严格遵守EUDamed平台的使用条款,避免高频次请求触发反爬机制。
  • 使用Selenium时,务必保证浏览器和WebDriver版本匹配,否则会出现启动失败问题。
  • 平台DOM结构或API接口可能更新,需定期检查并调整代码中的选择器或接口地址。

内容的提问来源于stack exchange,提问作者HFF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:22:19