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

如何提取网页表格内容筛选非已接受状态行,附现有代码报错求解决

问题分析与修复方案

报错原因定位

  • 核心问题是pd.DataFrame()构造时传入的data每行长度和columns长度不匹配,常见触发场景如下:
    1. 你用Selenium取的表头和BeautifulSoup取的表内容不属于同一个表格,页面存在多个表格时soup.find('table')默认取第一个,和Selenium定位的thead所属表格不一致
    2. 遍历行的时候没有先定位tbody,把thead里的表头行也纳入了内容行计算
    3. 部分行存在合并单元格、空单元格,导致提取的每行字段数和表头列数不一致

修正后的可运行代码

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver

# 此处省略driver初始化、页面跳转的前置代码

# 统一用BeautifulSoup处理全页内容,避免两边定位不一致问题
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 可根据页面实际情况给table增加class/id筛选条件,比如soup.find('table', class_='目标表格类名'),精准定位
target_table = soup.find('table')
# 单独提取表头
thead = target_table.find('thead')
columns = [th.get_text(strip=True) for th in thead.find_all('th')]
# 仅提取tbody内的内容行,排除表头干扰
tbody = target_table.find('tbody')
data = []
for tr in tbody.find_all('tr'):
    row = [td.get_text(strip=True) for td in tr.find_all('td')]
    # 自动补全长度不足的行,避免pandas报错
    if len(row) < len(columns):
        row += [''] * (len(columns) - len(row))
    data.append(row)

df = pd.DataFrame(data=data, columns=columns)
# 筛选状态非已接受的行,注意把「状态」替换为你实际表头里的状态列名称
df_filtered = df[df['状态'] != '已接受']
# 导出筛选后的结果,index=False避免导出多余的序号列
df_filtered.to_excel("files/prueba.xlsx", index=False)

driver.quit()
print("Realizado con exito")

遍历OC状态、勾选对应框的实现方案

直接用Selenium逐行处理效率更高,无需解析全表,逻辑参考:

# 定位目标表格的所有内容行
tr_list = driver.find_elements_by_css_selector('table tbody tr')
for tr in tr_list:
    # 定位当前行的状态列,nth-child(3)对应第3列,根据你实际的状态列位置调整数值即可
    status = tr.find_element_by_css_selector('td:nth-child(3)').text.strip()
    if status != '已接受':
        # 定位当前行的勾选框,选择器可根据页面实际元素属性调整
        tr.find_element_by_css_selector('input[type="checkbox"]').click()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:12:03