Python使用BeautifulSoup无法爬取网站数据 如何提取表格导出为CSV
问题原因
你要爬取的尼泊尔证券交易所floor-sheet页面是前端动态渲染的,初始请求返回的HTML只有页面框架代码,没有实际交易数据。交易数据是页面加载完成后,浏览器调用后端接口拿到数据再通过JS渲染到页面上的,requests库只能获取静态HTML,不会执行JS加载后续内容,所以你解析不到目标表格数据。
解决方案1:直接调用官方数据接口(更推荐)
通过浏览器开发者工具的网络面板可以抓包拿到页面请求数据的官方接口,直接获取JSON格式数据转CSV,效率更高不需要解析HTML,代码参考:
import requests import csv # 抓包获取的floor-sheet数据接口 api_url = "https://newweb.nepalstock.com/api/nots/nepse-data/floorsheet?size=1000&page=0&sort=contractId,desc" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept": "application/json" } resp = requests.get(api_url, headers=headers) resp_data = resp.json() floorsheet_list = resp_data.get("content", []) if floorsheet_list: # 取字段名做CSV表头 csv_header = floorsheet_list[0].keys() with open("nepal_stock_floorsheet.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=csv_header) writer.writeheader() writer.writerows(floorsheet_list) print(f"导出成功,共{len(floorsheet_list)}条数据") else: print("未获取到有效数据")
如果需要拉取全量数据,调整接口参数里的page值翻页即可,size参数可以调整每页返回的数据条数,最大支持2000条/页。
解决方案2:使用Selenium模拟浏览器加载
如果不想抓包找接口,可以用Selenium启动真实浏览器加载页面,等JS渲染完成后再解析内容:
首先安装依赖:pip install selenium webdriver-manager
代码参考:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import csv import time url = "https://newweb.nepalstock.com/floor-sheet" # 自动适配本地Chrome版本驱动 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get(url) # 等待页面数据加载完成,可根据自己的网络情况调整等待时长 time.sleep(6) soup = BeautifulSoup(driver.page_source, "lxml") # 匹配表格行,可根据实际页面结构调整选择器 table_rows = soup.select("table tbody tr") data_list = [] for row in table_rows: cols = [td.get_text(strip=True) for td in row.select("td")] if cols: data_list.append(cols) if data_list: with open("nepal_stock_floorsheet.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) # 可根据实际表头调整这里的字段 writer.writerow(["序号", "合同编号", "股票代码", "买方", "卖方", "数量", "价格", "总金额"]) writer.writerows(data_list) print(f"导出成功,共{len(data_list)}条数据") driver.quit()
内容的提问来源于stack exchange,提问作者Bajra
相关产品推荐
相关产品推荐

