Python Selenium抓取网页表格报AttributeError的解决方法
问题原因
- 触发
AttributeError: 'list' object has no attribute 'text'的直接原因:调用的find_elements()方法返回值是匹配到的所有元素组成的列表,列表类型没有.text属性,只有单个网页元素对象才能通过.text获取文本内容。 - 代码存在的其他问题:
- 填写的目标站点地址错误,和要爬取的站点不一致
- 手动配置的chromedriver路径存在系统适配问题:MacOS下的Chrome驱动是Unix可执行文件,不存在
.exe后缀;且Selenium 4.6及以上版本内置了驱动自动匹配能力,不需要手动指定驱动路径 - 全局检索所有
tr标签会混入页面其他无关表格的行、表头行,且仅尝试提取第一列内容,无法拿到完整的多字段结构化数据 - 没有加页面加载等待逻辑,页面渲染未完成时执行元素检索会拿到空结果或者报错
修正代码
from selenium.webdriver.common.by import By from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器驱动,新版Selenium自动匹配对应版本chromedriver,无需手动指定路径 driver = webdriver.Chrome() # 填入正确的目标站点地址 target_url = "https://sqlserverbuilds.blogspot.com/" driver.get(target_url) # 显式等待目标表格加载完成,最长等待10秒 wait = WebDriverWait(driver, 10) data_table = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'table'))) # 仅提取目标表格内的行,避免混入页面其他位置的无关元素 table_rows = data_table.find_elements(By.TAG_NAME, 'tr') structured_result = [] # 提取表头作为结构化数据的字段名 table_headers = [header.text.strip() for header in table_rows[0].find_elements(By.TAG_NAME, 'th')] # 遍历数据行(跳过第一行表头) for row in table_rows[1:]: cells = row.find_elements(By.TAG_NAME, 'td') # 跳过无有效单元格的空行 if len(cells) == 0: continue # 将单元格内容和表头字段一一对应,生成字典格式的行数据 row_content = {} for idx, cell in enumerate(cells): if idx < len(table_headers): row_content[table_headers[idx]] = cell.text.strip() structured_result.append(row_content) # 打印前5条数据验证结果 for record in structured_result[:5]: print(record) # 抓取完成后关闭浏览器 driver.quit()
使用说明
- 运行前请确保Selenium版本为4.6及以上,版本过低可执行
pip install --upgrade selenium升级,升级后无需单独下载chromedriver - 得到的
structured_result是标准的字典列表,可以直接传入pandas生成DataFrame,调用to_csv()或to_excel()方法即可导出为本地表格文件 - 如果只需要提取指定列(比如版本号、发布日期、KB编号),直接从生成的行字典里按key取值即可,不需要单独写复杂的XPath定位
内容的提问来源于stack exchange,提问作者Arun C O
相关产品推荐
相关产品推荐

