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

如何使用Beautiful Soup提取指定<em>标签间的全部数据?

解决方法:提取两个<em>标签之间的内容

嘿,我来帮你搞定这个问题!你之前用字符串分割的思路其实容易踩坑——因为HTML的字符串输出可能会有空格、换行或者格式变化,导致分割失败。咱们用BeautifulSoup的DOM节点遍历方法,更可靠也更灵活。

针对你的HTML结构的解决方案

你的HTML结构里,两个<em>分别在独立的<p>标签里,中间夹着另一个<p>内容。咱们可以直接定位到这两个<p>父节点,然后收集它们之间的所有兄弟节点:

from bs4 import BeautifulSoup

# 你的HTML内容
html_content = """
<p> <strong> <em> Insurtech </em> </strong> </p>
<p> .....Some data </p>
<p> <strong> <em> Biometrics </em> </strong> </p>
"""

soup = BeautifulSoup(html_content, 'html.parser')

# 获取所有<em>标签,确保至少有两个
em_tags = soup.find_all('em')
if len(em_tags) >= 2:
    first_em = em_tags[0]
    second_em = em_tags[1]
    
    # 找到两个<em>对应的父<p>标签
    first_p = first_em.find_parent('p')
    second_p = second_em.find_parent('p')
    
    # 收集两个<p>之间的所有内容
    between_content = []
    for sibling in first_p.next_siblings:
        # 遇到第二个<p>就停止遍历
        if sibling == second_p:
            break
        # 只保留有效标签节点(过滤掉换行等空白文本节点)
        if sibling.name:
            between_content.append(str(sibling))
    
    # 输出结果
    print("两个<em>之间的HTML内容:")
    print('\n'.join(between_content))
    
    # 如果只需要纯文本,这样处理:
    text_result = ' '.join([node.get_text(strip=True) for node in between_content])
    print("\n提取的纯文本内容:")
    print(text_result)
else:
    print("页面中找不到至少两个<em>标签")

更通用的解决方案(适用于任意位置的)

如果你的<em>标签可能出现在任意结构里,不局限于<p>,可以用遍历节点的方式,从第一个<em>之后开始,直到碰到第二个<em>为止:

from bs4 import BeautifulSoup

html_content = """
<p> <strong> <em> Insurtech </em> </strong> </p>
<div>这里也可能有内容</div>
<p> .....Some data </p>
<p><strong><em>Biometrics</em></strong></p>
"""

soup = BeautifulSoup(html_content, 'html.parser')

em_tags = soup.find_all('em')
if len(em_tags) >= 2:
    first_em = em_tags[0]
    second_em = em_tags[1]
    
    between_content = []
    current_node = first_em.next_element
    
    # 遍历节点直到遇到第二个<em>
    while current_node != second_em:
        # 处理标签节点
        if current_node.name:
            between_content.append(str(current_node))
        # 处理文本节点,过滤空白内容
        else:
            cleaned_text = current_node.strip()
            if cleaned_text:
                between_content.append(cleaned_text)
        current_node = current_node.next_element
    
    print("中间内容:")
    print('\n'.join(between_content))

为什么你的原方法不可靠?

你之前用soup_str.split(str(start_tag))的方式,完全依赖于<em>标签的字符串输出和你预期的完全一致,但BeautifulSoup输出的标签可能会有额外空格、换行,或者如果标签有属性(比如<em class="highlight">),字符串分割就会直接失效。而基于DOM节点的遍历是直接操作HTML的结构,不受这些格式变化影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:04:49