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
相关产品推荐
相关产品推荐

