如何用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>")
关键说明
- 递归查找所有option:
soup.find_all('option')会遍历整个DOM树,不管 - 过滤逻辑:
- 先跳过没有
value属性的选项 - 直接排除
value="All"的选项 - 用
isdigit()判断是否是纯数字年份(如果年份格式是4位数字,这个判断足够) - 可选正则匹配
^[A-Z]+-\d+$,确保value是「大写字母+横杠+数字」的格式,精准匹配你要的HC-225这类选项。
- 先跳过没有
- 提取内容:用
opt.get('value')拿属性值,opt.get_text(strip=True)去掉文本前后的空白字符。
内容的提问来源于stack exchange,提问作者user1849365
相关产品推荐
相关产品推荐

