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

