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

