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

