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

如何使用Xpath或CSS选择器获取第一个h3标签之前的所有p标签

解决方案

1. XPath方案(仅提取p标签)

你之前写的XPath //span[@id="description"]/h3[1]/preceding-sibling::p 本身语法是正确的,它会匹配所有位于第一个h3标签之前的同级p标签,返回结果是节点集合而非单个节点。如果你只拿到了第一个p,大概率是你的解析器调用逻辑只取了集合的第一个元素,调整取值逻辑即可拿到全部符合要求的p标签。

如果需要匹配第N个和第N+1个h3之间的所有节点,可以参考如下通用写法:

//span[@id="description"]/h3[N]/preceding-sibling::*[preceding-sibling::h3[N-1]]

把上面的N替换成对应的序号即可提取对应区间的节点。

2. jQuery方案(支持全内容拆分,可处理文本节点)

如果需要完整按h3拆分所有内容(包括文本节点、其他标签),可以直接遍历所有子节点拆分,代码如下:

const $content = $('#description').contents();
// 存储拆分后的分段数据
const sections = [];
let currentSection = {
    title: '', // h3标题
    content: [] // 对应分段的所有节点
};

$content.each(function () {
    // 遇到h3标签就开启新分段
    if (this.tagName === 'H3') {
        if (currentSection.title || currentSection.content.length) {
            sections.push(currentSection);
        }
        currentSection = {
            title: $(this).text().trim(),
            content: []
        };
    } else {
        // 非h3标签存入当前分段的内容
        currentSection.content.push(this);
    }
});
// 把最后一个分段存入数组
sections.push(currentSection);

拆分后sections数组的第一个元素的content就是第一个h3之前的所有内容,后续每个元素对应一个h3标题下的所有内容,完美解决无法获取文本节点的问题。

如果仅需要提取第一个h3之前的所有内容,可以用更简单的写法:

const $desc = $('#description').clone();
// 直接删除第一个h3以及它之后的所有内容
$desc.find('h3:first').nextAll().addBack().remove();
// 直接获取剩余内容的HTML
const result = $desc.html().trim();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:54:03