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

Selenium提取网页数据无法正确写入pandas DataFrame问题

问题根因

你的代码存在3个核心问题,直接导致数据存储失败、程序卡顿、输出结果为空:

  • Selenium元素引用失效:通过Selenium定位到的books是绑定当前浏览器会话的WebElement对象,并非实际的文本数据。finally块会在try块逻辑执行完立刻运行driver.quit()关闭浏览器,如果你没有在关浏览器之前把所有元素的文本提取为Python原生字符串/字典等数据类型,后续操作这些失效的元素引用时,要么触发StaleElementReferenceException异常被静默吞掉,要么程序长时间等待响应卡死。
  • 变量覆盖+命名拼写不一致:
    • 字典列表实现逻辑中,你写了books = [{}],直接覆盖了之前Selenium定位到的网页元素列表,后续循环遍历的是自己创建的空字典列表,根本没有读取网页内容。
    • 字段名前后拼写不统一:提取字段时命名为publiser,写入DataFrame时用了未定义的ekdoths;提取时命名为country,存字典时用了polh,这类错误会直接触发NameError中断流程,如果没有显式捕获打印异常,最终只会返回空结果。
  • pandas用法错误:DataFrame.append()方法在pandas 2.0及以上版本已经被完全移除,且逐行追加DataFrame的方式本身效率极低,数据量稍大就会出现明显卡顿,无异常捕获的场景下很容易出现空结果。
修复实现(推荐方案)

核心原则:所有和网页元素交互的操作(读取文本、获取属性等)必须在driver.quit()执行前完成,把提取到的内容全部转成Python原生数据结构后,再做DataFrame转换、持久化存储操作,绝对不要留存WebElement对象到浏览器关闭之后。

import pandas as pd
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 提前初始化存储列表,不要和Selenium元素变量重名避免覆盖
book_data = []

try:
    # 定位目标元素
    books = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.ID, "titleitem"))
    )
    # 浏览器关闭前提取所有文本内容
    for book in books:
        splited = book.text.split("\n")
        # 增加字段长度校验,避免单条数据缺字段触发索引越界
        if len(splited) >= 5:
            single_book = {
                "writer": splited[0].strip(),
                "title": splited[1].strip(),
                "publiser": splited[2].strip(),
                "country": splited[3].strip(),
                "ISBN": splited[4].strip()
            }
            book_data.append(single_book)
finally:
    # 所有数据提取完成后再关闭浏览器
    driver.quit()

# 浏览器关闭后再做DataFrame转换、文件存储,不会有任何引用问题
df = pd.DataFrame(book_data)
# 持久化存储示例
# df.to_csv("books.csv", index=False, encoding="utf-8-sig")
print(df)
优化建议
  • 不要逐行给DataFrame追加数据,先把所有数据存在字典列表中,最后一次性转为DataFrame,效率比逐行append高数十倍,不会出现卡顿问题。
  • 提取文本后增加strip()处理,去掉多余的换行、首尾空格,避免存储冗余字符。
  • 增加字段长度校验,避免单条数据字段缺失时触发索引越界,导致整个提取流程中断。
  • 调试阶段可以增加异常打印,快速定位变量未定义、元素失效类问题,不要让异常被静默吞掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:48:32