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

