使用Selenium提取HTML表格转pandas DataFrame返回WebElement报错如何解决
Selenium提取HTML表格转DataFrame问题解决方案
问题原因
你当前输出的不是报错,是Selenium定位元素后返回的WebElement对象的默认打印内容。你的代码仅定位到了表格的第二行元素,既没有提取元素内的文本内容,也没有按表格结构做结构化解析,因此输出的是对象标识而非预期的表格数据。
解决方案
推荐直接用pandas自带的read_html方法解析,无需手动逐行处理,修改你的最后两行代码即可:
import pandas as pd import time from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup options = Options() options.add_argument('--headless') options.add_argument('--disable-gpu') driver = webdriver.Chrome(executable_path = 'mypath/chromedriver.exe', options = options) driver.get("https://ai.fmcsa.dot.gov/SMS") wait = WebDriverWait(driver, 20) wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@title='Close']"))).click() wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[@name='MCSearch'])[2]"))).send_keys('1818437') wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[@name='search'])[2]"))).click() wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='BASICs']/p[2]/a"))).click() # 以下为修改后的代码 # 等待完整表格加载完成 table_elem = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.XPATH,'//*[@id="BASICs"]/table'))) # 获取表格的完整HTML源码 table_html = table_elem.get_attribute('outerHTML') # 直接解析为DataFrame df = pd.read_html(table_html)[0] print(df) # 用完关闭浏览器实例 driver.quit()
可选手动解析方案
如果需要自定义提取逻辑,也可以逐行遍历单元格:
# 等待所有行加载完成 rows = WebDriverWait(driver,20).until(EC.presence_of_all_elements_located((By.XPATH,'//*[@id="BASICs"]/table/tbody/tr'))) table_data = [] for row in rows: # 提取当前行所有单元格文本 cell_list = row.find_elements(By.TAG_NAME, 'td') row_data = [cell.text.strip() for cell in cell_list] if row_data: table_data.append(row_data) # 转换为DataFrame,可自定义表头 df = pd.DataFrame(table_data) print(df)
内容的提问来源于stack exchange,提问作者alexb
相关产品推荐
相关产品推荐

