使用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
相关产品推荐
相关产品推荐

