如何用Python Pandas从CDE网站提取表格数据存CSV?现有代码无输出求修正
问题描述
- 练习目标:使用Python Pandas从公开网站提取表格数据并导出为CSV文件
- 目标网站:https://www.cde.org.cn/hymlj/listpage/c723ac5960cee1811b7be33a2acf8224
- 遇到的问题:编写的测试代码无法获取到任何数据,需要找出问题并提供正确实现
测试代码:
import pandas as pd url = "https://www.cde.org.cn/hymlj/listpage/c723ac5960cee1811b7be33a2acf8224" def get_data(url): data = [] for pageNum in range(1,3): try: data.append(pd.read_html(f'{url}&pageNum={pageNum}&pageSize=10&classId=c723ac5960cee1811b7be33a2acf8224&drugname=&pzwh=',header = 1, match='药品名称')[0].iloc[:-1,:-1]) pd.concat(data).to_csv('test1.csv', index=False, encoding='utf_8_sig') except: if pageNum < (pageNum - 1): continue else: print("Has tried %d times to access url %s, all failed!", pageNum, url) break if __name__ == '__main__': get_data(url)
问题分析
- 动态渲染限制:目标网站的表格数据是通过JavaScript动态加载的,静态HTML源码中不包含表格内容,
pd.read_html只能解析静态HTML里的表格,因此直接爬取无法获取数据。 - URL拼接错误:原URL是页面路径,直接在末尾加
&会导致参数格式错误,且该网站分页并非通过GET参数直接传递。 - 异常处理逻辑无效:
if pageNum < (pageNum -1)这个条件永远不成立,无法实现重试;同时宽泛的异常捕获会掩盖具体错误原因。 - 数据保存时机不合理:每次循环都执行合并和写入操作,既低效又可能导致重复写入。
正确实现代码
由于网站数据是动态加载的,我们需要用selenium模拟浏览器渲染页面,再提取表格数据,完整代码如下:
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def get_cde_table_data(url, pages=2): # 初始化无头Chrome浏览器(需提前配置ChromeDriver) options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') driver = webdriver.Chrome(options=options) driver.get(url) all_data = [] for page in range(1, pages + 1): try: # 等待表格加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "table")) ) # 提取当前页表格数据 df = pd.read_html(driver.page_source, match='药品名称')[0] # 清理数据:移除最后一行(分页信息)和最后一列(操作按钮) df_clean = df.iloc[:-1, :-1] all_data.append(df_clean) # 跳转到下一页(非最后一页时执行) if page < pages: next_btn = driver.find_element(By.CSS_SELECTOR, ".next") next_btn.click() time.sleep(2) # 等待页面加载 except Exception as e: print(f"第{page}页获取失败: {str(e)}") continue # 合并数据并导出CSV if all_data: pd.concat(all_data).to_csv('cde_drug_data.csv', index=False, encoding='utf_8_sig') print(f"成功获取{len(all_data)}页数据,已导出到cde_drug_data.csv") else: print("未获取到任何数据") driver.quit() if __name__ == '__main__': target_url = "https://www.cde.org.cn/hymlj/listpage/c723ac5960cee1811b7be33a2acf8224" get_cde_table_data(target_url, pages=2)
注意事项
- 提前安装依赖:
pip install pandas selenium - 需下载对应浏览器的驱动(如ChromeDriver),并确保其路径配置在环境变量中,或在初始化
webdriver.Chrome时指定executable_path参数 - 若无头模式加载失败,可去掉
--headless参数,查看浏览器实际加载情况调整等待时间
内容的提问来源于stack exchange,提问作者mike2851jgsa84
相关产品推荐
相关产品推荐

