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

如何修正Python+Selenium爬取多URL点击后表格的解析报错?

解决pd.read_html爬取动态表格时"No table found"的报错问题

我看了你的代码和目标页面的HTML结构,问题核心在于你直接把Selenium的WebElement对象传给了pd.read_html——这个函数只接受HTML字符串、URL或者文件对象,不认识WebElement,这才导致了找不到表格的报错。另外还有几个细节需要调整,我给你梳理完整的修正方案:

  • 修正表格数据的传递方式:driver.find_elements_by_xpath返回的是WebElement列表,你需要先提取表格的HTML源代码,再传给pd.read_html解析。
  • 添加显式等待:点击"Songinfo"标签后,表格可能需要短暂渲染时间,用显式等待替代直接操作,能避免因页面未加载完成导致的抓取失败。
  • 优化元素定位逻辑:目标页面只有一个目标表格,用find_element(单数形式)比find_elements更精准,省去列表索引的麻烦。

以下是修正后的完整代码:

import csv
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

df_list = [] 
# 初始化Chrome驱动(请确保你的浏览器驱动路径配置正确,或传入executable_path参数)
driver = webdriver.Chrome()

with open(r"C:\Users\nlvijn02\Documents\Personal documents\Sony\Test_input_links.csv") as file: 
    reader = csv.reader(file) 
    for row in reader: 
        url = row[0]
        print(f"正在处理链接: {url}") 
        driver.get(url) 
        
        # 等待Songinfo标签可点击后再点击
        songinfo_tab = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//a[@href='#songinfo']"))
        )
        songinfo_tab.click()
        
        # 等待目标表格加载完成,获取表格的完整HTML代码
        table_element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, "//*[@id='songinfo']/table"))
        )
        table_html = table_element.get_attribute('outerHTML')
        
        # 解析HTML字符串,取第一个(也是唯一的)表格转为DataFrame
        df = pd.read_html(table_html)[0]
        df_list.append(df) 

# 合并数据并保存到CSV
if df_list:
    final_df = pd.concat(df_list, ignore_index=True)
    final_df.to_csv("details.csv", index=False)
    print("数据抓取完成,已保存到details.csv")
else:
    print("未抓取到任何表格数据,请检查链接或页面结构")

driver.quit()  # 用quit()比close()更彻底,会退出整个浏览器进程

关键细节说明:

  1. 显式等待的必要性:动态页面的元素加载时间不确定,WebDriverWait会等待元素满足条件后再执行操作,比固定时长的time.sleep更灵活可靠。
  2. HTML字符串传递:通过get_attribute('outerHTML')获取表格的完整HTML代码,这是pd.read_html能够识别的输入格式。
  3. 表格解析处理:pd.read_html返回的是DataFrame列表,因为目标页面只有一个表格,所以直接取索引[0]的元素即可。

另外,针对你提供的HTML结构,这个表格存在跨行的表头(A-kant、B-kant),pd.read_html会自动解析为常规的行列结构,如果之后需要更清晰的格式(比如区分A/B面信息),可以对DataFrame做进一步的清洗处理,比如添加标识列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:57:40