Python使用BeautifulSoup时find方法返回None报错是什么原因
问题根因
- 你在调用
tableData函数前,已经通过soup1.find('table', attrs={'summary': 'Standings - Detailed View'})拿到了符合属性要求的table节点,此时传入函数的data参数本身就是你要找的目标table对象 - 函数内部执行
data.find(attrs=attrs)时,find方法的作用是在当前节点的后代子节点中搜索符合条件的元素,不会检查当前节点本身的属性。而table节点的子节点里不存在带summary="Standings - Detailed View"属性的元素,因此返回None,触发后续报错。 - 你调试时观测到的
summary属性是data(也就是目标table本身)的属性,不是其子节点的,和find方法的搜索范围不匹配。
修复方案
方案1:修改函数逻辑,删除多余的find操作
既然传入的data已经是目标table,直接处理即可,不需要再做一次查找:
def tableData(data): row = [] tr = data.find_all('tr') header = [ th.get_text(strip=True) for th in data.find_all('th') ] if header: row.append(header) for tr in tr[1:]: row.append([ td.get_text(strip=True) for td in tr.find_all('td')]) return row # 调用时直接传找到的table即可 print(tableData(table))
方案2:修改调用方式,传入soup对象而非提前查找table
如果你想保留函数内的查找逻辑,调用时直接把整个soup对象传入即可:
# 调用时不传提前找到的table,传soup对象 print(tableData(soup1, {'summary': 'Standings - Detailed View'}))
内容的提问来源于stack exchange,提问作者munish
相关产品推荐
相关产品推荐

