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

如何用Python的BeautifulSoup提取与<h2>对应的所有<p>标签?

解决方法

核心思路是遍历每个<h2>标签,收集它之后所有的<p>标签,直到碰到下一个<h2>或者没有更多兄弟节点为止。用BeautifulSoup的next_siblings属性就能轻松实现这个逻辑。

代码实现

from bs4 import BeautifulSoup

# 示例HTML内容
html_content = """
<h2>Heading Text1</h2>

<p>Paragraph1</p>
<p>Paragraph2</p>

<h2>Heading Text2</h2>

<p>Paragraph3</p>
<p>Paragraph4</p>
<p>Paragraph5</p>
"""

soup = BeautifulSoup(html_content, 'html.parser')
heading_paragraphs = {}

# 遍历所有h2标签
for h2 in soup.find_all('h2'):
    heading_text = h2.get_text(strip=True)
    paragraphs = []
    # 获取当前h2之后的所有兄弟节点
    for sibling in h2.next_siblings:
        # 跳过空白节点(比如换行符、空格)
        if sibling.name is None:
            continue
        # 如果碰到下一个h2,停止收集
        if sibling.name == 'h2':
            break
        # 如果是p标签,提取文本
        if sibling.name == 'p':
            paragraphs.append(sibling.get_text(strip=True))
    # 将标题和对应的段落存入字典
    heading_paragraphs[heading_text] = paragraphs

# 打印结果
for heading, paras in heading_paragraphs.items():
    print(f"标题: {heading}")
    print("段落:")
    for p in paras:
        print(f"- {p}")
    print("---")

代码说明

  1. next_siblings属性:获取当前标签之后的所有兄弟节点,包括换行、空格这类空白节点,所以需要先判断sibling.name是否为None来跳过它们。
  2. 终止条件:当遍历到下一个<h2>标签时,立即停止当前标题对应的段落收集,避免把其他标题的段落混进来。
  3. 文本提取:用get_text(strip=True)可以自动去除文本前后的空白字符,让结果更干净。

运行这段代码后,你会得到这样的输出:

标题: Heading Text1
段落:
- Paragraph1
- Paragraph2
---
标题: Heading Text2
段落:
- Paragraph3
- Paragraph4
- Paragraph5
---

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:00:39