使用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
相关产品推荐
相关产品推荐

