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

Selenium无法定位目标网站表格的问题求助

问题分析与解决

核心错误点

  1. BeautifulSoup查找表格语法错误:
    你写的sopa.find(name = 'table border')是错误用法,name参数仅接受HTML标签名(比如'table'),border是标签属性,不能和标签名合并书写。

  2. HTML元素获取逻辑颠倒:
    你先获取了<tbody>的HTML内容,再试图找<table>标签,但<tbody>本身是<table>的子元素,提取的HTML里根本没有<table>标签,导致tabela变量为None,最终pd.read_html找不到表格。

  3. 页面等待不充分:
    仅等待URL变化不代表表格已经渲染完成,可能URL更新后表格元素还未加载,导致后续获取的内容为空或元素不存在。


修正后的代码

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

# 原页面操作逻辑保留
ANS_TabNetMLR_URL = navegador.get("http://www.ans.gov.br/anstabnet/cgi-bin/dh?dados/tabnet_rc.def")
selecionarLinha = Select(navegador.find_element(By.XPATH, '//*[@id="L"]'))
selecionarLinha.select_by_visible_text('Operadora')

selecionarColuna = Select(navegador.find_element(By.XPATH, '//*[@id="C"]'))
selecionarColuna.select_by_visible_text('Grupo Modalidade')

selecionarConteudo = Select(navegador.find_element(By.XPATH, '//*[@id="I"]'))
selecionarConteudo.deselect_by_visible_text('Receita de contraprestações')
selecionarConteudo.select_by_visible_text('Despesa assistencial')

selecionarMostra = navegador.find_element(By.XPATH, '//*[@id="geral"]/thead/tr[2]/td[2]/center/form/table[2]/tbody/tr[4]/td/p[2]/input[1]').click()

# 优化等待逻辑:先等URL变化,再等表格加载完成
novaURL = 'http://www.ans.gov.br/anstabnet/cgi-bin/tabnet?dados/tabnet_rc.def'
WebDriverWait(navegador, 10).until(ec.url_to_be(novaURL))
table_locator = (By.XPATH, '//*[@id="geral"]/thead/tr[2]/td[2]/center/table')
WebDriverWait(navegador, 10).until(ec.presence_of_element_located(table_locator))

# 获取整个表格的HTML(而非tbody)
encontrarTabela = navegador.find_element(*table_locator)
HTML_tabela_MLR = encontrarTabela.get_attribute('outerHTML')

# 直接用pd.read_html解析表格,无需多余的BeautifulSoup步骤
lista_completa_MLR = pd.read_html(HTML_tabela_MLR, index_col='Operadora', header=0, thousands='.')
# read_html返回DataFrame列表,取第一个元素得到目标表格
df_completo_MLR = lista_completa_MLR[0]

额外说明

  • 简化了流程:pd.read_html可以直接解析HTML表格字符串,不需要通过BeautifulSoup中转,减少代码复杂度。
  • 增强了稳定性:增加表格元素的等待判断,确保表格完全渲染后再读取内容,避免因加载延迟导致的错误。
  • 修正了返回值处理:明确pd.read_html返回的是DataFrame列表,通过索引[0]提取实际需要的表格数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:15:36