如何选择不具备特定属性值的HTML元素?附代码修正方案
如何选择不包含特定属性值的HTML元素
问题分析
你原来的代码存在两个关键错误:
- 元素类型不匹配:HTML结构里是
<th>标签,但代码中查找的是td,导致无法定位目标元素。 - 列表推导式逻辑错误:
rows[i].findAll('td') and not rows[i].findAll(...)的写法不符合语法逻辑,应该在遍历单个元素时添加过滤条件。
正确实现方法
方法一:列表推导式+属性判断
遍历所有<th>元素,过滤掉data-stat="DUMMY"的项,同时用strip=True清理文本前后的空格:
x = [th.getText(strip=True) for th in rows[i].findAll('th') if th.get('data-stat') != 'DUMMY']
方法二:使用BeautifulSoup的findAll带lambda过滤
通过attrs参数传入lambda表达式,直接筛选符合条件的元素:
target_th = rows[i].findAll('th', attrs={'data-stat': lambda val: val != 'DUMMY'}) x = [th.getText(strip=True) for th in target_th]
方法三:CSS选择器
利用CSS否定选择器直接定位目标元素:
target_th = rows[i].select('th[data-stat!="DUMMY"]') x = [th.getText(strip=True) for th in target_th]
完整示例
假设你的HTML解析环境已经准备好,完整代码示例如下:
from bs4 import BeautifulSoup # 模拟你的HTML结构 html = """ <table> <tr> <th data-stat='foo'> 10 </th> <th data-stat='bar'> 20 </th> <th data-stat='DUMMY'> </th> </tr> </table> """ soup = BeautifulSoup(html, 'html.parser') rows = soup.findAll('tr') # 模拟rows列表 # 提取目标文本 x = [th.getText(strip=True) for th in rows[0].findAll('th') if th.get('data-stat') != 'DUMMY'] print(x) # 输出: ['10', '20']
内容的提问来源于stack exchange,提问作者theloosygoose
相关产品推荐
相关产品推荐

