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

使用Beautiful Soup无法从Clinicaltrials.gov提取表格该如何解决

目标表格提取方案

你遇到的无tbody标签属于正常情况:浏览器渲染页面时会自动给缺少tbody的table标签补全该节点,但你通过requests拿到的是页面原始HTML代码,本身不存在tbody标签,直接提取tr节点即可。
更稳定的定位方式是直接通过表格的唯一class属性匹配,比取find_all结果的索引更可靠,完整可运行代码如下:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url =  "https://www.clinicaltrials.gov/ct2/results?cond=Activated+Protein+C+Resistance"
# 注意不要用re作为变量名,会和Python标准库正则模块名冲突
resp = requests.get(url)
soup = BeautifulSoup(resp.text, "html.parser")
# 目标表格的class属性为data_table,直接用属性定位,稳定性更高
target_table = soup.find("table", {"class": "data_table"})

# 提取表头
headers = [th.get_text(strip=True) for th in target_table.find_all("th")]
# 提取行数据,跳过表头所在的第一行tr
rows = []
for tr in target_table.find_all("tr")[1:]:
    row_data = [td.get_text(strip=True) for td in tr.find_all("td")]
    if row_data: # 过滤空行
        rows.append(row_data)

# 可直接转为DataFrame方便后续处理
df = pd.DataFrame(rows, columns=headers)
print(df)
页面目标数据通用定位方法
  • 先确认数据加载模式:禁用浏览器JavaScript后刷新页面,若目标数据仍然存在则为静态渲染,可直接通过请求原始HTML解析;若数据消失则为动态渲染,优先去浏览器网络面板抓对应异步接口,直接拿结构化JSON数据效率远高于解析HTML。
  • 静态元素优先用唯一属性定位:优先用id、class、自定义属性等有明确标识的属性匹配元素,不要依赖标签的索引顺序定位,页面结构微小改动就会导致索引失效。如果目标元素没有唯一属性,可以找它的父节点/子节点/兄弟节点中存在唯一属性的元素作为锚点,再通过节点关系定位目标。
  • 不要完全依赖开发者工具的DOM结构:开发者工具里看到的是浏览器渲染后的最终DOM结构,和你请求拿到的原始HTML可能存在差异,定位前一定要先打印请求返回的原始文本,确认数据确实存在且结构符合预期,避免把渲染后的附加节点当成原始结构踩坑。
  • 可以用浏览器自带的选择器工具辅助定位:在开发者工具元素面板右键目标元素,可直接复制对应的CSS选择器或Xpath,直接在解析库中使用即可,大幅提升定位效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:06:07