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

使用BeautifulSoup爬取ClinicalTrials.gov时无法识别表头(检查元素可见表头)

使用BeautifulSoup爬取ClinicalTrials.gov时无法识别表头(检查元素可见表头)

嗨,我懂你现在的困扰——明明在浏览器检查元素里能看到ClinicalTrials.gov上的临床试验表头,但用BeautifulSoup爬取的时候就是识别不到,对吧?毕竟你是要做线粒体疾病的研究,得准确拿到这些数据才行。我来给你分析下可能的原因,再给你具体的解决办法:

可能的原因及对应解法

  • 表头是动态加载的
    很多现代网站会用JavaScript动态生成页面内容,而BeautifulSoup只能解析静态的HTML代码。如果你直接用requests获取页面,得到的是JS执行前的原始HTML,自然看不到那些动态生成的表头。
    这时候可以用Selenium这类工具模拟浏览器加载页面,等JS执行完毕后再获取完整的HTML内容。给你个示例代码:

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from webdriver_manager.chrome import ChromeDriverManager
    from bs4 import BeautifulSoup
    
    url = "https://clinicaltrials.gov/search?cond=mitochondrial%20diseases&page=1"
    
    # 初始化Chrome浏览器
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
    driver.get(url)
    # 等待页面完全加载(这里用隐式等待,也可以用显式等待更精准)
    driver.implicitly_wait(10)
    
    # 获取加载后的页面源码
    page_html = driver.page_source
    soup = BeautifulSoup(page_html, "html.parser")
    
    # 尝试提取表头
    thead = soup.find("thead")
    if thead:
        table_headers = [th.get_text(strip=True) for th in thead.find_all("th")]
        print("成功提取表头:", table_headers)
    else:
        print("还是没找到表头,可能需要调整选择器或者等待时间")
    
    # 关闭浏览器
    driver.quit()
    
  • 选择器书写错误
    有时候检查元素里看到的结构,和实际爬取到的HTML可能有细微差别——比如class名带动态生成的后缀,或者标签嵌套层级不同。你可以先把爬取到的静态HTML保存下来看看:

    import requests
    from bs4 import BeautifulSoup
    
    url = "https://clinicaltrials.gov/search?cond=mitochondrial%20diseases&page=1"
    # 记得加User-Agent,避免被网站拦截
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
    
    response = requests.get(url, headers=headers)
    # 保存页面到本地,方便查看结构
    with open("clinical_trials_page.html", "w", encoding="utf-8") as f:
        f.write(response.text)
    
    soup = BeautifulSoup(response.text, "html.parser")
    # 尝试用不同的选择器查找表头,比如根据标签或属性
    headers = soup.find_all("th", class_=lambda x: x and "header" in x.lower())
    if headers:
        print("找到表头:", [h.get_text(strip=True) for h in headers])
    

    打开保存的HTML文件,看看表头实际的结构,再调整选择器。

  • 表头在iframe中
    少数情况下,网站会把内容放在iframe里,直接爬主页面的HTML自然找不到。你可以检查检查元素里的表头是否在<iframe>标签内,如果是,需要先定位到iframe,再获取里面的文档内容(用Selenium的话可以切换iframe)。

额外提醒

  • 爬取时记得遵守网站的robots.txt规则,ClinicalTrials.gov一般允许非商业性的研究爬取,但不要频繁请求,最好加个延时(比如time.sleep(2))避免被拦截。
  • 虽然你现在想练手,但还是建议尽量使用官方API,API的数据更规范也更稳定,适合长期研究使用。

备注:内容来源于stack exchange,提问作者Gautam Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:17:57