
本文详解如何使用 BeautifulSoup 精准提取 标签中特定 class 类名(如 stat_alarm)、 内容和 数值,通过 CSS 选择器与属性解析实现结构化数据抽取。
本文详解如何使用 beautifulsoup 精准提取 `
` 数值,通过 css 选择器与属性解析实现结构化数据抽取。
在网页解析实践中,常需从具有复合 class 的
分别承载指标名称与实测值。直接调用 .text 会丢失结构、合并所有文本,无法区分字段边界;而仅用 find_all("div", class_="tab_box") 又无法定位动态变化的状态类(如 stat_ok/stat_alarm)。
推荐使用 CSS 选择器 + 属性访问 + 迭代解包 的组合方案:
- 使用 soup.select("div.stat_alarm, div.stat_ok") 精确匹配含目标状态类的 ,避免空节点(如 )干扰;
- 通过 div.attrs["class"] 获取 class 属性列表(如 ['tab_box', 'stat_alarm']),取末尾元素 [-1] 即为状态标识;
- 利用 div.stripped_strings(返回生成器,自动去除空白并剥离标签)安全提取纯文本序列,再用解包 *div.stripped_strings 获取 和
的内容(顺序即 DOM 顺序);
- 最后格式化输出或存入字典/DataFrame。
from bs4 import BeautifulSoup html = """\ <div class="tab_box stat_alarm"> <span>pH [pH]</span><h1>6.9</h1> </div> <div class="tab_box stat_alarm"> <span>Redox [mV]</span><h1>667</h1> </div> <div class="tab_box stat_ok"> <span>Temp. [°C]</span><h1>9.5</h1> </div> <div class="tab_box"></div>""" soup = BeautifulSoup(html, "html.parser") for div in soup.select("div.stat_alarm, div.stat_ok"): try: status_class = div.attrs["class"][-1] strings = list(div.stripped_strings) # 确保至少有两个文本节点(span + h1) if len(strings) >= 2: label, value = strings[0], strings[1] print(f"{status_class:<p><strong>注意事项:</strong> </p>- 若 class 顺序不固定(如 class="stat_ok tab_box"),建议改用 next(c for c in div.attrs["class"] if c.startswith("stat_")) 安全提取;
- stripped_strings 不包含注释或隐藏文本,如需更细粒度控制,可显式定位:div.find("span").get_text(strip=True) 和 div.find("h1").get_text(strip=True);
- 对空 ,select() 已过滤,但若 HTML 结构不稳定,务必添加 try/except 或长度校验;
- 生产环境建议指定解析器(如 "lxml")提升性能与容错性:BeautifulSoup(html, "lxml")。
该方法兼顾可读性、健壮性与扩展性,是解析带状态标记的仪表盘类 HTML 的典型范式。











