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

使用BeautifulSoup提取两个h2元素之间的p标签数据

同级h2标签对应段落分组抓取方案

核心逻辑

h2与对应p标签为同级兄弟节点时,不需要单独提取全量h2、p标签再做位置匹配,直接逐一遍历每个h2的后续兄弟节点,直到碰到下一个h2或文档末尾终止,中途收集到的所有p标签就是当前h2对应的内容。
之前写的第二段遍历兄弟节点的代码逻辑已经接近正确,问题是仅做了内容打印,没有按h2维度做结构化存储,因此拿不到分组后的映射结果。

可直接运行的实现代码

import requests
from bs4 import BeautifulSoup, Tag

# 请求目标页面
page = requests.get("https://www.obd-codes.com/p0100")
soup = BeautifulSoup(page.content, 'html.parser')

# 存储最终分组结果
result = []

for h2 in soup.find_all('h2'):
    current_group = {
        "h2_title": h2.get_text(strip=True),
        "content_paragraphs": []
    }
    # 从当前h2的下一个兄弟节点开始遍历
    current_node = h2.nextSibling
    while current_node is not None:
        # 仅处理实际标签节点,跳过空白换行类的文本节点
        if isinstance(current_node, Tag):
            # 碰到下一个h2标签,终止当前分组的收集
            if current_node.name == "h2":
                break
            # 碰到p标签就提取文本存入当前分组
            if current_node.name == "p":
                p_content = current_node.get_text(strip=True)
                if p_content: # 过滤空内容的p标签
                    current_group["content_paragraphs"].append(p_content)
        # 移动到下一个兄弟节点
        current_node = current_node.nextSibling
    # 将当前h2的分组加入最终结果
    result.append(current_group)

# 结果打印示例
for group in result:
    print(f"【标题】{group['h2_title']}")
    for index, para in enumerate(group["content_paragraphs"]):
        print(f"段落{index+1}:{para}\n")

代码说明

  • 最终返回的result为标准数组对象,每个元素对应一个h2标题,包含标题文本和其下对应的所有段落文本列表,可直接用于后续处理
  • 自动跳过了节点间的空白换行、无内容空p标签,不会返回冗余无效内容
  • 逻辑完全匹配给定HTML结构规则:两个相邻h2之间的所有p标签归属前一个h2,最后一个h2会收集到文档末尾的所有对应p标签

内容的提问来源于stack exchange,提问作者Curtis Harper Scott Young

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:15:52