使用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
相关产品推荐
相关产品推荐

