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

使用lxml处理colspan抓取指定HTML表格至Python DataFrame求助

问题描述

我是Python新手,需要从类似https://tshf.sas.com/techsup/download/hotfix/HF2/E1Y_r64.html#E1Y015的URL中,通过XPath.//table[contains(., 'E1Y015 ')]定位唯一的大型HTML表格并抓取为DataFrame,核心需求是正确处理colspan属性。

此前使用pd.read_html时,生成的CSV会出现单元格重复值,无法处理colspan;且需遍历多个类似URL,目标表格位置不固定,无法通过表格索引定位,现寻求基于lxml或其他有效方法的实现代码。

附之前使用read_html的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By 
import pandas as pd
import html5lib

driver = webdriver.Chrome()
driver.get("xxxxx.html")
# 该页面包含需要抓取的表格所在的链接
# 获取这些链接元素
links = driver.find_elements("xpath", '//table/tbody/tr/td[3]/a[1]')
for l in links:
    # 获取链接的href属性值
    url = str(l.get_attribute('href'))
    # 处理链接以定位正确的表格
    spl_char='#'
    r = url.partition(spl_char)[2] + '\s+'
    all_tables = pd.read_html(url,match=r,keep_default_na=False)
    df = all_tables[0]
    # 保存为CSV,忽略arc变量,仅用于文件名
    with open('./%s.csv' %arc[i], 'a') as f:
        f.write('\n')
    df.to_csv('./%s.csv' %arc[i] , mode='a', index=False, header=False)
解决方案:基于lxml处理colspan的表格抓取

以下代码使用lxml解析HTML,手动处理colspan属性,确保单元格内容正确填充到对应列,最终转换为DataFrame:

from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
from lxml import html

driver = webdriver.Chrome()
driver.get("xxxxx.html")
links = driver.find_elements(By.XPATH, '//table/tbody/tr/td[3]/a[1]')

# 遍历每个目标链接
for idx, link in enumerate(links):
    target_url = link.get_attribute('href')
    # 提取链接锚点作为表格匹配关键词
    anchor_keyword = target_url.split('#')[-1] + ' '

    # 加载目标页面并解析HTML
    driver.get(target_url)
    page_html = driver.page_source
    tree = html.fromstring(page_html)

    # 定位目标表格(唯一匹配)
    target_table = tree.xpath(f'.//table[contains(., "{anchor_keyword}")]')[0]

    # 第一步:计算表格处理colspan后的实际最大列数
    rows = target_table.xpath('.//tr')
    max_column_count = 0
    for row in rows:
        current_cols = 0
        cells = row.xpath('.//td|.//th')
        for cell in cells:
            colspan = int(cell.get('colspan', 1))
            current_cols += colspan
        if current_cols > max_column_count:
            max_column_count = current_cols

    # 第二步:遍历行并处理colspan,填充表格数据
    table_content = []
    for row in rows:
        row_data = []
        cells = row.xpath('.//td|.//th')
        for cell in cells:
            cell_text = cell.text_content().strip()
            colspan = int(cell.get('colspan', 1))
            # 将单元格内容填充到colspan对应的所有列
            row_data.extend([cell_text] * colspan)
        # 补全行长度至最大列数,避免结构不匹配
        while len(row_data) < max_column_count:
            row_data.append('')
        table_content.append(row_data)

    # 转换为DataFrame
    df = pd.DataFrame(table_content)

    # 保存到CSV(注意arc变量需提前定义,此处用idx对应索引)
    csv_path = f'./{arc[idx]}.csv'
    with open(csv_path, 'a') as f:
        f.write('\n')
    df.to_csv(csv_path, mode='a', index=False, header=False)

# 关闭浏览器实例
driver.quit()

关键说明

  • 精准定位表格:通过锚点关键词结合contains()的XPath表达式,无需依赖表格索引,适配不同URL的目标表格位置
  • colspan处理逻辑:先计算表格实际最大列数,再将带colspan的单元格内容填充到对应数量的列中,避免pd.read_html的重复值问题
  • 多URL兼容:自动从每个链接提取锚点作为匹配关键词,无需手动修改规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:05:41