如何提取网页表格内容筛选非已接受状态行,附现有代码报错求解决
问题分析与修复方案
报错原因定位
- 核心问题是
pd.DataFrame()构造时传入的data每行长度和columns长度不匹配,常见触发场景如下:- 你用Selenium取的表头和BeautifulSoup取的表内容不属于同一个表格,页面存在多个表格时
soup.find('table')默认取第一个,和Selenium定位的thead所属表格不一致 - 遍历行的时候没有先定位tbody,把thead里的表头行也纳入了内容行计算
- 部分行存在合并单元格、空单元格,导致提取的每行字段数和表头列数不一致
- 你用Selenium取的表头和BeautifulSoup取的表内容不属于同一个表格,页面存在多个表格时
修正后的可运行代码
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
相关产品推荐
相关产品推荐

