使用BeautifulSoup爬取网页表格下载链接仅获表头,求解决方法
问题原因
目标页面的表格数据并非直接嵌入在初始HTML中,而是通过JavaScript动态加载的。urllib.request只能获取页面首次加载的静态源码,此时表格的<tbody>还未被填充数据,所以只能拿到表头行。
解决方案1:用Selenium模拟浏览器渲染(直观易实现)
Selenium可以模拟浏览器打开页面,等待JavaScript执行完成后再获取完整页面源码,这样就能拿到所有表格行。
步骤:
- 先安装Selenium和对应浏览器驱动(比如ChromeDriver,要和浏览器版本匹配)
- 编写代码模拟浏览器加载并解析页面
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options import time testurl = 'https://www.ercot.com/mp/data-products/data-product-details?id=NP3-562-CD' # 配置Chrome无头模式(可选,不弹出浏览器窗口) chrome_options = Options() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') # 初始化浏览器驱动 driver = webdriver.Chrome(options=chrome_options) driver.get(testurl) # 等待页面加载完成(根据网络情况调整等待时间) time.sleep(3) # 获取完整页面源码并解析 page_content = BeautifulSoup(driver.page_source, "html.parser") driver.quit() # 遍历表格行提取下载链接 table_dt = page_content.find("table") for tr in table_dt.find_all("tr"): links = tr.find_all("a", href=True) if links: for link in links: print(f"下载链接: {link['href']}")
解决方案2:直接调用后端API接口(更高效)
打开浏览器开发者工具(F12),切换到Network标签页刷新页面,能找到加载表格数据的API接口。直接请求这个接口可以拿到结构化数据,无需渲染页面。
比如这个页面的表格数据来自接口https://www.ercot.com/api/1/services/read/dashboards/np3-562-cd/data,返回JSON格式数据,包含所有文件的下载链接。
import requests api_url = 'https://www.ercot.com/api/1/services/read/dashboards/np3-562-cd/data' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get(api_url, headers=headers) data = response.json() # 遍历数据提取下载链接 for item in data['rows']: download_link = item.get('url') if download_link: print(f"下载链接: {download_link}")
注意:API接口可能会随网站更新变化,需要自己通过开发者工具确认最新地址;请求时带上合适的User-Agent,避免被反爬拦截。
内容的提问来源于stack exchange,提问作者Moji
相关产品推荐
相关产品推荐

