BeautifulSoup如何精准筛选class属性仅为table_body的标签
解决BeautifulSoup筛选仅包含指定单一class标签的方法
核心实现逻辑
你需要匹配的是class属性仅包含table_body单个类名的标签,利用BeautifulSoup会自动将class属性解析为类名列表的特性,直接判断标签的类名列表是否完全等于['table_body']即可,代码如下:
from bs4 import BeautifulSoup as soup html = ''' <tr class="table_body notice inside ">1</tr> <tr class="table_body notice inside ">2</tr> <tr class="table_body">3</tr> <tr class="table_body">4</tr> ''' soup = soup(html, 'lxml') # 正确写法:判断标签类名列表完全匹配仅含table_body的情况 res = soup.find_all(lambda tag: tag.name == 'tr' and tag.get('class') == ['table_body']) print(res)
运行结果完全符合预期:
[<tr class="table_body">3</tr>, <tr class="table_body">4</tr>]
原方法失效原因说明
res1失效:class_='table_body'是默认的包含匹配规则,只要标签的类名列表中存在table_body就会命中,不会校验是否有其他类名res2失效:endswith逻辑本身无法适配单类匹配需求,且示例中多类标签的class属性末尾带有空格,也无法触发匹配判定res3失效:lambda逻辑写反,你设置的条件是class值不等于多类的长字符串,单类标签也满足该条件,所以会返回所有符合条件的标签
内容的提问来源于stack exchange,提问作者minholee
相关产品推荐
相关产品推荐

