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

bs4的findAll传入双class属性字典时仅返回green标签的问题排查

运行结果异常截图

错误原因
  • Python原生字典不支持重复键名,代码中属性字典两次声明class键,后定义的键值会覆盖前值,最终传入查询方法的匹配条件仅保留单个class规则,自然无法同时匹配两类标签。
  • 额外注意:class是Python语言保留关键字,直接在find/find_all方法中传class=参数会触发语法错误,bs4专门提供了class_别名参数适配这个场景;同时class本身是HTML多值属性,直接给字典传单值的逻辑,不适用多类名匹配需求。
修复方案

两种常用写法都可以实现同时匹配class为green、red的span标签:

  • 方案1:用class_参数直接传值列表,写法最简洁
namelist = bsObj.find_all('span', class_=['green', 'red'])
  • 方案2:用正则匹配class属性值,适合更复杂的模糊匹配场景
import re
namelist = bsObj.find_all('span', {'class': re.compile(r'^(green|red)$')})
修正后完整代码
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup

URL = 'https://www.pythonscraping.com/pages/warandpeace.html'

def get_title(URL):
    try:
        html = urlopen(URL)
    except HTTPError as e:
        return None
    try:
        bsObj = BeautifulSoup(html.read(), 'html.parser')
        namelist = bsObj.find_all('span', class_=['green', 'red'])
    except AttributeError as e:
        return None
    return namelist

namelist = get_title(URL)
if namelist == None:
    print('we cant take title')
else:
    for name in namelist:
        print(name.get_text())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:45:38