如何用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("---")
代码说明
next_siblings属性:获取当前标签之后的所有兄弟节点,包括换行、空格这类空白节点,所以需要先判断sibling.name是否为None来跳过它们。- 终止条件:当遍历到下一个
<h2>标签时,立即停止当前标题对应的段落收集,避免把其他标题的段落混进来。 - 文本提取:用
get_text(strip=True)可以自动去除文本前后的空白字符,让结果更干净。
运行这段代码后,你会得到这样的输出:
标题: Heading Text1 段落: - Paragraph1 - Paragraph2 --- 标题: Heading Text2 段落: - Paragraph3 - Paragraph4 - Paragraph5 ---
内容的提问来源于stack exchange,提问作者W01v3n
相关产品推荐
相关产品推荐

