使用BeautifulSoup抓取表格失败:soup.find返回None
网页表格抓取问题排查与解决
问题情况
尝试抓取https://rfef.es/es/competiciones/primera-federacion的网页表格时,soup.find返回None,导致后续代码无法执行。现有代码如下:
import requests from bs4 import BeautifulSoup as bs import pandas as pd url = 'https://rfef.es/es/competiciones/primera-federacion' page = requests.get(url) soup = bs(page.text, 'lxml') table1 = soup.find("div", id="tab-pane active") headers = [] for i in table1.find_all("th"): title = i.text headers.append(title) df = pd.DataFrame(columns = headers) for j in table1.find_all("tr")[1:]: row_data = j.find_all("td") row = [i.text for i in row_data] length = len(df) df.loc[length] = row
错误原因
从网页元素截图可知,目标元素的tab-pane和active是两个CSS类名,而非id属性。原代码错误地将类名当作id来查找,且id="tab-pane active"这种写法本身不符合HTML规范(id不能包含空格),所以soup.find无法匹配到任何元素,返回None。
修正后的代码
将元素选择方式改为匹配CSS类,同时补充必要的异常处理:
import requests from bs4 import BeautifulSoup as bs import pandas as pd url = 'https://rfef.es/es/competiciones/primera-federacion' page = requests.get(url) soup = bs(page.text, 'lxml') # 修正:通过class查找目标div,同时匹配tab-pane和active两个类 table_container = soup.find("div", class_="tab-pane active") # 也可以用CSS选择器写法:table_container = soup.select_one("div.tab-pane.active") if table_container: # 定位到表格核心元素 table = table_container.find("table") headers = [] for th in table.find_all("th"): headers.append(th.get_text(strip=True)) df = pd.DataFrame(columns=headers) for tr in table.find_all("tr")[1:]: row_data = tr.find_all("td") row = [td.get_text(strip=True) for td in row_data] # 校验行数据长度,避免表格结构异常导致报错 if len(row) == len(headers): df.loc[len(df)] = row print(df) else: print("未找到目标表格容器")
额外优化点
- 增加元素存在性判断,避免因未找到元素触发后续代码报错
- 使用
get_text(strip=True)自动去除文本中的多余空格、换行,让数据更整洁 - 添加行数据长度校验,防止表格结构异常导致DataFrame列不匹配
内容的提问来源于stack exchange,提问作者Carlos Lozano
相关产品推荐
相关产品推荐

