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

