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

如何用BeautifulSoup提取嵌套<option>标签及其内容?

解决BeautifulSoup提取嵌套

直接给你能跑通的解决方案,先分析你可能踩的坑:

  • 如果你之前用了select('select > option')这种选择器,只会匹配<select>的直接子元素,嵌套在<optgroup>里的<option>会被漏掉,得用递归查找的方式。
  • 过滤逻辑没写全,比如没判断value是否存在,或者年份的判断不准确。

完整代码示例

from bs4 import BeautifulSoup
import re

# 替换成你的实际HTML内容(也可以从文件/网络请求获取)
html = """
<select name="product">
  <option value="All">All Products</option>
  <option value="2024">2024 Archive</option>
  <optgroup label="MEPS Series">
    <option value='HC-225'>MEPS HC-225: Engine Performance Data</option>
    <option value='HC-300'>MEPS HC-300: Emission Standards Report</option>
    <option value="2023">2023 Archive</option>
  </optgroup>
</select>
"""

# 解析HTML
soup = BeautifulSoup(html, 'html.parser')

# 递归获取所有<option>标签(包括嵌套在optgroup里的)
all_options = soup.find_all('option')

# 过滤出目标选项:排除value为All、纯数字年份的,保留HC-XXX格式的
target_options = []
for opt in all_options:
    opt_value = opt.get('value')
    # 跳过无value、value为All、纯数字的选项
    if not opt_value or opt_value == 'All' or opt_value.isdigit():
        continue
    # 可选:精确匹配HC-XXXXX格式的value(如果需要更严格的过滤)
    if re.match(r'^[A-Z]+-\d+$', opt_value):
        target_options.append({
            'value': opt_value,
            'text': opt.get_text(strip=True)
        })

# 输出结果
for item in target_options:
    print(f"<option value='{item['value']}'>{item['text']}</option>")

关键说明

  1. 递归查找所有option:soup.find_all('option')会遍历整个DOM树,不管
  2. 过滤逻辑:
    • 先跳过没有value属性的选项
    • 直接排除value="All"的选项
    • 用isdigit()判断是否是纯数字年份(如果年份格式是4位数字,这个判断足够)
    • 可选正则匹配^[A-Z]+-\d+$,确保value是「大写字母+横杠+数字」的格式,精准匹配你要的HC-225这类选项。
  3. 提取内容:用opt.get('value')拿属性值,opt.get_text(strip=True)去掉文本前后的空白字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:50:50