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

如何使用Python的Selenium同时提取HTML表格中th和td标签的数据

问题原因分析
  • 你的第一个写法//*[@id="content"]/table/tbody/tr[3]/th/td是查找<th>标签内部的<td>子元素,但从你给出的HTML结构看,<th>和<td>是同级元素,都在<tr>标签下,所以这个路径根本匹配不到任何元素。
  • 第二个写法里的and是Python的逻辑运算符,不是XPath的语法,实际执行时只会返回第二个XPath路径(即仅匹配<td>元素)的结果,所以你只能拿到5个<td>的数据,缺了前2个<th>的内容。
解决方案

正确的XPath写法

要同时匹配同一<tr>下的<th>和<td>元素,使用XPath的|运算符(节点并集)即可:

cols = driver.find_elements_by_xpath('//*[@id="content"]/table/tbody/tr[3]/th | //*[@id="content"]/table/tbody/tr[3]/td')

执行后就能拿到该行全部7个元素。

完整遍历表格生成DataFrame的参考代码

import pandas as pd
# 前面的表单提交代码保持不变,以下是获取表格数据的部分

# 先确认表头(注意根据实际表格的行索引调整tr的下标)
headers = []
heads = driver.find_elements_by_xpath('//*[@id="content"]/table/tbody/tr[2]/th')
for h in heads:
    headers.append(h.text.strip())

# 初始化存储所有行数据的列表
data = []
rows = driver.find_elements_by_xpath('//*[@id="content"]/table/tbody/tr')
# 从第三行开始是实际数据,可根据表格实际结构调整起始索引
for row in rows[2:]:
    # 取当前行所有th和td
    cells = row.find_elements_by_xpath('./th | ./td')
    # 提取每个单元格的文本
    row_data = [cell.text.strip() for cell in cells]
    data.append(row_data)

# 生成DataFrame
df = pd.DataFrame(data, columns=headers)
# 打印验证结果
print(df.head())
优化建议
  • 如果遇到单元格文本为空的情况,可以用cell.get_attribute('textContent')代替cell.text,部分渲染异常的内容用该方法可以正常提取。
  • 新版Selenium已经废弃了find_elements_by_*系列方法,建议升级后使用driver.find_elements(By.XPATH, '路径')写法,需提前导入from selenium.webdriver.common.by import By。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:36:01