使用BeautifulSoup爬取HTML表格出现NoneType无select属性报错如何解决
报错根因说明
你遇到的AttributeError: 'NoneType' object has no attribute 'select'报错,核心原因是执行table.select时,table变量为None,证明上一步的soup.find操作没有匹配到任何符合条件的表格元素。
具体问题点&修复方案
- 问题1:请求未携带headers参数
代码中提前定义了请求头,但调用requests.get时没有传入该参数,目标站点有基础反爬校验,无合法UA的请求会返回异常页面,不存在目标表格。修复时只需给get方法添加headers参数即可。 - 问题2:表格匹配规则错误
你使用attrs={'style':"border"}做完全匹配,但实际页面中表格的style属性值不会只有border四个字符,完全匹配无法命中元素。可以修改为模糊匹配规则,匹配style属性值中包含border的表格。 - 问题3:未定义header变量
最后创建DataFrame时使用的header变量没有提前定义,即使成功获取表格数据也会触发NameError。可以提前爬取表格表头赋值给header,或者根据实际需求自定义表头内容。
修正后参考代码
import requests from bs4 import BeautifulSoup import pandas as pd headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.3" } # 新增传入headers参数 r = requests.get("https://capitalonebank2.bluematrix.com/sellside/Disclosures.action", headers=headers) soup = BeautifulSoup(r.content, "lxml") # 修改为模糊匹配style包含border的表格,同时增加非空判断兜底 table = soup.find('table', attrs={'style': lambda x: x and 'border' in x}) if not table: print("未找到符合条件的表格,请检查页面返回内容或匹配规则") exit() all_data = [] # 提前爬取表头赋值给header变量 header = [th.get_text(strip=True) for th in table.select("tr th")] for row in table.select("tr:has(td)"): tds = [td.get_text(strip=True) for td in row.select("td")] all_data.append(tds) df = pd.DataFrame(all_data, columns=header) print(df)
排查建议
如果修改后仍然找不到表格,可以先打印r.text查看请求返回的页面内容,确认是否被反爬拦截,返回了验证页面或者空白内容,再对应调整请求策略。
内容的提问来源于stack exchange,提问作者Arslan Aziz
相关产品推荐
相关产品推荐

