如何解决BeautifulSoup find查找table返回None类型报错问题
报错根本原因
table1返回None和你选择lxml/html.parser/html5lib哪种解析器无关,核心问题是你传给BeautifulSoup的页面源码里,根本不存在id为fth1的表格。
你代码里虽然导入了selenium,但初始化Chrome驱动后没有调用get()方法访问目标页,实际拉取页面内容的是requests。该站点对默认的裸requests请求做了反爬校验,返回的内容不是你在浏览器里看到的带完整表格的页面,自然匹配不到目标元素。
对应解决方法
你可以二选一:
方案1:使用selenium获取渲染后页面(稳定性更高)
既然已经引入了selenium,直接用它加载页面、拿到动态渲染完成的源码再解析即可,不要和requests混用。修正后代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import time # 浏览器配置,不需要弹出可视化窗口可以打开无头模式 chrome_opt = Options() # chrome_opt.add_argument("--headless=new") driver = webdriver.Chrome(options=chrome_opt) # 访问目标页面,等待渲染完成 driver.get('https://stooq.pl/t/?i=513&v=1&l=1') time.sleep(2) # 拿渲染后的完整源码做解析 soup = BeautifulSoup(driver.page_source, 'lxml') driver.quit() table1 = soup.find('table', {'id': "fth1"}) # 增加判空逻辑,避免偶发加载失败抛错 if not table1: print("目标表格加载失败,请重试") else: headers = [i.text.strip() for i in table1.find_all('th')] print(headers)
方案2:给requests加请求头模拟浏览器(轻量方案)
如果不想启动浏览器,可以给requests加上真实浏览器的User-Agent请求头,绕过基础反爬:
import requests from bs4 import BeautifulSoup # 模拟正常浏览器的请求头 req_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } resp = requests.get('https://stooq.pl/t/?i=513&v=1&l=1', headers=req_headers) soup = BeautifulSoup(resp.text, 'lxml') table1 = soup.find('table', {'id': "fth1"}) if not table1: print("请求被反爬拦截,请切换方案1") else: headers = [i.text.strip() for i in table1.find_all('th')] print(headers)
注意:如果方案2加了请求头还是拿不到表格,说明站点有更严格的动态渲染校验,直接用方案1即可。
内容的提问来源于stack exchange,提问作者Kamil Komnacki
相关产品推荐
相关产品推荐

