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

Selenium网页爬取返回空列表及df未定义问题求助

香港天文台表格爬取问题解决

问题概述

尝试用Selenium爬取香港天文台指定页面的表格,遇到两个核心问题:

  • 第一段代码返回空列表,保存时提示df未定义
  • 第二段代码能打印表格内容,但无法通过append()保存为CSV

核心需求:实现表格爬取并导出为CSV;次要需求:用循环简化月份列命名代码。

问题原因分析

第一段代码问题

  • 空列表/df未定义:起始行r=1对应表头(<th>标签),但代码用find_element查找<td>标签,第一次循环就触发NoSuchElementException,导致templist为空、df从未被定义,最终保存报错。
  • 硬编码12个月份列,代码冗余。

第二段代码问题

仅打印数据,未将数据结构化为DataFrame,且未初始化df,直接调用df.append()无效,无法保存为CSV。

完整解决方案代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import pandas as pd

# 初始化浏览器
driver = webdriver.Chrome(executable_path="path/chromedriver.exe")
url = 'https://www.hko.gov.hk/en/cis/awsDailyElement.htm?stn=WB8&ele=PREV_DIR&y=2022'
driver.get(url)

# 初始化存储列表和月份缩写
templist = []
month_abbrs = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

# 从第2行开始爬取数据行(第1行是表头)
r = 2
while True:
    try:
        # 获取日期列
        day = driver.find_element(By.XPATH, 
            f"/html/body/div[2]/div[2]/div/div/div[4]/div/div[3]/table/tr[{r}]/td[1]").text
        
        # 循环获取12个月的数据
        month_data = []
        for col_idx in range(2, 14):  # 列2到13对应12个月
            data = driver.find_element(By.XPATH, 
                f"/html/body/div[2]/div[2]/div/div/div[4]/div/div[3]/table/tr[{r}]/td[{col_idx}]").text
            # 替换空值为N.A.
            month_data.append(data if data.strip() != '' else 'N.A.')
        
        # 构造字典,用循环简化月份列命名
        row_dict = {'Day': day}
        for month, data in zip(month_abbrs, month_data):
            row_dict[month] = data
        
        templist.append(row_dict)
        r += 1
    except NoSuchElementException:
        # 没有更多数据时退出循环
        break

# 转换为DataFrame并保存为CSV
if templist:
    df = pd.DataFrame(templist)
    df.to_csv('D:/FYP/WIND_Prev_dir/WB8.csv', index=False)
else:
    print("未爬取到任何数据")

driver.close()

关键优化说明

  1. 修复空列表/df未定义问题:从第2行(r=2)开始爬取数据行,避免表头无<td>标签导致的异常;增加templist非空判断,防止无数据时保存报错。
  2. 用循环简化月份列命名:通过month_abbrs列表和zip()函数,循环生成月份对应的键值对,替代硬编码的12个月份变量。
  3. 空值处理:将空白数据替换为N.A.,保证数据一致性。
  4. 代码可读性提升:使用f-string拼接XPATH,避免繁琐的字符串拼接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:07:00