Selenium无法定位目标网站表格的问题求助
问题分析与解决
核心错误点
BeautifulSoup查找表格语法错误:
你写的sopa.find(name = 'table border')是错误用法,name参数仅接受HTML标签名(比如'table'),border是标签属性,不能和标签名合并书写。HTML元素获取逻辑颠倒:
你先获取了<tbody>的HTML内容,再试图找<table>标签,但<tbody>本身是<table>的子元素,提取的HTML里根本没有<table>标签,导致tabela变量为None,最终pd.read_html找不到表格。页面等待不充分:
仅等待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
相关产品推荐
相关产品推荐

