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

BeautifulSoup无法获取嵌套div下所有data_from、data_to类元素求助

问题核心原因

提取失败本质是你传入的HTML存在大量未闭合的div标签。
你给出的示例里,class为data_from、data_to的4个div都没有写对应的闭合标签</div>,BeautifulSoup默认解析器遇到这种不规范结构时,会自动做结构修正,默认把未闭合的子节点按嵌套关系处理,最终只会识别到第一个子节点,其余节点会被判定为无效结构直接丢弃,这就是你遍历alldata节点时只能拿到第一个data_from元素的根本原因。

可行解决方案

1. 优先更换高容错解析器

如果你的数据源本身就是这种不规范的HTML(很多老站点会有这种不写闭合标签的情况),直接换用html5lib解析器,它的HTML修正逻辑和浏览器完全一致,不会随意丢弃未闭合节点,是处理脏HTML的首选。
先安装依赖:
pip install beautifulsoup4 html5lib

2. 对应提取代码

from bs4 import BeautifulSoup

# 替换成你实际的HTML内容
raw_html = """
<div class="alldata">
  <div class="data_from">
  <div class="data_to">
  <div class="data_to">
  <div class="data_from">
</div>
"""

# 用html5lib加载解析
soup = BeautifulSoup(raw_html, "html5lib")

# 提取所有带class属性的元素
all_elems_with_class = soup.find_all(class_=True)
for item in all_elems_with_class:
    print(f"class值:{item['class']},内部文本:{item.text.strip()}")

# 单独提取data_from、data_to类的元素
target_elems = soup.find_all(class_=["data_from", "data_to"])
for elem in target_elems:
    print(elem.prettify())

注意事项

  • 不要用Python内置的html.parser解析不规范HTML,它的容错逻辑极差,很容易丢节点
  • 如果用lxml解析器依然出现节点丢失,直接替换成html5lib即可
  • 提取多个指定class的元素时,直接给class_参数传入class名组成的列表即可,不需要写复杂的筛选规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:57:32