如何用Python抓取指定网页HTML表格数据并导出为CSV?
解决表格数据抓取仅获表头的问题
问题根源
页面表格数据是动态加载的——初始HTML里只有表头,实际数据是页面加载后通过AJAX请求从后端接口获取的。即使使用requests_html.render(),如果没有等待AJAX请求完成,或者没有正确提取渲染后的HTML,还是拿不到数据。
方案1:修正requests_html的使用方式
你的代码里用了r.content.decode('utf8')解析,但这是原始HTTP响应内容,不是浏览器渲染后的完整HTML。应该改用r.html.html获取渲染后的页面内容,同时延长等待时间确保AJAX请求完成:
import requests from bs4 import BeautifulSoup import csv from requests_html import HTMLSession url = 'https://www.fidelitypensionmanagers.com/Home/PriceHistory' s = HTMLSession() r = s.get(url) # 延长等待时间,确保AJAX数据加载完成 r.html.render(sleep=5, timeout=10) # 使用渲染后的HTML内容创建soup soup = BeautifulSoup(r.html.html, "lxml") table = soup.find("table",{"id":"fund-I"}) rows = table.findAll('tr') header_text = [th.text.strip() for th in rows[0].findAll('th')] row_text_array = [] for row in rows[1:]: row_text = [elem.text.replace('\n', '').strip() for elem in row.findAll(['th', 'td'])] row_text_array.append(row_text) with open("out.csv", "w", newline="", encoding="utf-8") as f: wr = csv.writer(f) wr.writerow(header_text) wr.writerows(row_text_array)
方案2:直接抓取后端API(更高效)
通过浏览器开发者工具的「网络」标签,能查到页面加载数据的AJAX接口,直接请求这个接口比渲染页面更高效、更稳定:
import requests import csv # 实际获取数据的API接口 api_url = "https://www.fidelitypensionmanagers.com/Home/GetPriceHistory" # 请求参数(对应表格id为fund-I的基金数据) payload = {"fundId": "I"} # 模拟AJAX请求的必要头信息 headers = { "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/x-www-form-urlencoded" } response = requests.post(api_url, data=payload, headers=headers) # 解析返回的JSON数据 data = response.json() # 定义表头(根据接口返回字段调整) csv_headers = ["Date", "Price", "NAV"] # 整理数据行 csv_rows = [[item["Date"], item["Price"], item["NAV"]] for item in data] # 写入CSV文件 with open("out.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(csv_headers) writer.writerows(csv_rows)
说明:方案2更推荐,直接抓API避免了浏览器渲染的开销,数据格式也更规范,无需解析HTML表格。
内容的提问来源于stack exchange,提问作者purplemonstera
相关产品推荐
相关产品推荐

