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

如何用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)
问题分析
  1. 动态渲染限制:目标网站的表格数据是通过JavaScript动态加载的,静态HTML源码中不包含表格内容,pd.read_html只能解析静态HTML里的表格,因此直接爬取无法获取数据。
  2. URL拼接错误:原URL是页面路径,直接在末尾加&会导致参数格式错误,且该网站分页并非通过GET参数直接传递。
  3. 异常处理逻辑无效:if pageNum < (pageNum -1)这个条件永远不成立,无法实现重试;同时宽泛的异常捕获会掩盖具体错误原因。
  4. 数据保存时机不合理:每次循环都执行合并和写入操作,既低效又可能导致重复写入。
正确实现代码

由于网站数据是动态加载的,我们需要用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:38