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

如何使用Scrapy和Python按指定节点拆分HTML页面?

使用Scrapy实现HTML按指定节点拆分的方法

核心思路

以指定的拆分节点(如h1/h2/h3)为分隔锚点,利用XPath的节点位置关系,抓取每个锚点到下一个锚点之间的所有同级元素,包括锚点本身,以此实现页面内容的分段拆分。

实现步骤

  1. 标记拆分节点的位置:通过XPath的preceding-sibling统计每个拆分节点在同级节点中的位置索引,确定它们在DOM结构中的顺序。
  2. 按位置区间抓取元素:遍历每个拆分节点,定义当前节点到下一个拆分节点的位置区间,抓取该区间内的所有同级元素,最后将元素转为HTML字符串存入结果集合。

完整代码实现

def split(response, split_selectors):
    result = []
    # 记录每个拆分节点在同级节点中的位置(从1开始计数)
    split_positions = []
    for selector in split_selectors:
        pos = selector.xpath("count(preceding-sibling::*) + 1").get()
        split_positions.append(float(pos))
    
    # 逐个处理每个拆分节点对应的内容段
    for i, selector in enumerate(split_selectors):
        current_pos = split_positions[i]
        # 确定当前段的结束位置:最后一个节点则取无限大,否则取下一个拆分节点的位置
        end_pos = float('inf') if i == len(split_selectors)-1 else split_positions[i+1]
        
        # 抓取当前区间内的所有同级元素
        elements = selector.xpath(f"../*[count(preceding-sibling::*) + 1 >= {current_pos} and count(preceding-sibling::*) + 1 < {end_pos}]")
        # 将每个元素转为HTML字符串,加入结果列表
        result.append([elem.get() for elem in elements])
    
    return result

使用示例

在Scrapy爬虫中调用该函数:

def parse(self, response):
    # 用XPath指定作为拆分锚点的节点
    split_nodes = response.xpath("//*[self::h1 or self::h2 or self::h3]")
    sections = split(response, split_nodes)
    # 处理拆分后的分段内容
    for section in sections:
        print(section)

原理说明

  • 借助preceding-sibling::*统计节点位置,是利用DOM同级节点的固定顺序,通过位置数值精准划分内容区间。
  • 每个拆分区间的范围是「当前锚点节点」到「下一个锚点节点的前一个元素」,确保每个分段以指定节点开头,包含后续所有不属于下一分段的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:05:41