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

Python网页爬取如何从RxNav网站成功获取RXCUI编号

原代码的问题
  • findAll()方法返回的是所有匹配DOM节点的列表,不是单个标签对象,列表本身没有find()方法,直接调用会触发属性错误。
  • 缺少动态加载等待逻辑:目标站点的RXCUI信息是前端异步渲染的,执行driver.page_source时如果目标节点还没渲染完成,拿到的源码里不存在对应元素,自然提取失败。
  • 直接取span的文本会拿到带前缀的冗余内容,原节点文本格式为RXCUI: xxxxxx,不做清洗拿不到纯编号。
正确实现方案

方案1:修正原有Selenium爬取逻辑

针对原有代码的问题做对应修复即可,核心是加显式等待确保元素渲染完成、正确获取单个DOM节点、清洗冗余文本:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

# 最长等待10秒,直到RXCUI节点加载完成
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "rxcuiDecoration"))
)

content = driver.page_source
soup = BeautifulSoup(content, 'html.parser')
# 用find获取单个匹配的div节点,不要用返回列表的findAll
cont = soup.find("div", {"id": "titleHolder"})
rx = cont.find("span", id="rxcuiDecoration")
# 清洗文本,去掉前缀拿到纯RXCUI编号
rxcui = rx.text.strip().replace("RXCUI:", "").strip()
print(rxcui)

方案2:无浏览器接口请求(更稳定高效)

目标站点提供了同域名下的结构化查询接口,不需要启动Selenium渲染页面,直接发起HTTP请求就能拿到结构化结果,避免动态渲染的各类问题:

import requests

ndc = "51079045120"
resp = requests.get(
    "https://mor.nlm.nih.gov/REST/rxcui.json",
    params={"idtype": "NDC", "id": ndc},
    timeout=10
)
resp.raise_for_status()
result = resp.json()
rxcui = result["idGroup"]["rxnormId"][0]
print(rxcui)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:33:33