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

如何使用Python Xpath提取HTML两个标题间的表格数据并转JSON

目标表格XPath定位写法

定位两个指定h2之间表格的核心XPath如下:
//h2[span[@id="Perlis"]]/following-sibling::table[following-sibling::h2[span[@id="Kedah"]]]
逻辑说明:

  • 先匹配内部携带id="Perlis"的span的h2节点
  • 取该h2之后的所有同级table节点
  • 仅保留那些后续存在内部携带id="Kedah"的span的h2节点的table,刚好锁定两个h2之间的所有表格
    如果确认两个h2中间只有1个目标表格,直接取索引0即可拿到对应节点。
Scrapy实现代码

假设你的表格第一列为选区ID、第二列为选区名称,完整爬虫实现参考如下:

import scrapy
import json

class ConstituencySpider(scrapy.Spider):
    name = "constituency_spider"
    # 本地HTML文件可以用file:///绝对路径填充,也可以直接填目标页面URL
    start_urls = ["你的目标页面地址"]

    def parse(self, response):
        # 定位目标表格
        target_table = response.xpath('//h2[span[@id="Perlis"]]/following-sibling::table[following-sibling::h2[span[@id="Kedah"]]]').get()
        if not target_table:
            return
        res_list = []
        # 遍历表格行,[1:]表示跳过表头行,如果没有表头可以去掉
        for row in target_table.xpath('./tr | ./tbody/tr')[1:]:
            # 提取数据,缺省值设置避免空节点报错
            c_id = row.xpath('./td[1]/text()').get(default='').strip()
            c_name = row.xpath('./td[2]/text()').get(default='').strip()
            if c_id and c_name:
                res_list.append({
                    "constituency_id": c_id,
                    "constituency_name": c_name
                })
        # 输出指定结构的JSON文件
        with open("perlis_constituency.json", "w", encoding="utf-8") as f:
            json.dump(res_list, f, ensure_ascii=False, indent=2)
        yield {"data": res_list}
适配调整说明
  • 如果表格列顺序和默认假设不同,调整td[索引]的数值即可,XPath节点索引从1开始计数
  • 如果两个h2之间有多个表格,可以在table的过滤条件中追加属性过滤,比如增加[contains(@class, "election-table")]筛选带指定类名的表格
  • 如果原始HTML没有tbody标签(浏览器渲染时自动生成的tbody不会出现在页面源码中),去掉XPath中的/tbody部分即可
  • 选区名称如果有嵌套标签(比如a标签),调整提取路径为./td[2]//text()取所有后代文本即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:12:03