You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup无法读取网站表格,求替代Selenium的解决方案

不用Selenium抓取动态渲染表格的替代方案

这是爬取动态网站时很常见的问题——你通过浏览器看到的表格,是页面加载完成后由JavaScript动态生成的,而requests只能获取到页面的初始静态HTML源码,自然看不到这些后续渲染出来的内容。不用Selenium的话,有几个更轻量高效的方案,我给你详细说说:

1. 直接抓取后端API接口(最推荐)

绝大多数动态加载的内容,都是前端通过AJAX/Fetch请求从后端API获取的。你可以通过浏览器开发者工具找到这个接口:

  • 打开目标页面,按下F12打开开发者工具,切换到「Network」标签
  • 刷新页面,在请求列表里筛选「XHR」或「Fetch」类型的请求
  • 逐个查看请求的「Preview」内容,找到返回表格数据的那个接口
  • 拿到接口URL和请求参数后,直接用requests请求这个接口,就能拿到结构化的JSON数据,比解析HTML方便太多

比如你这个网站,大概率会有一个专门返回筛选结果的API,可能带类似screener_id之类的参数,请求后就能直接拿到表格里的所有数据。

2. 用requests-html执行JavaScript渲染页面

requests-html是requests的扩展库,内置了无头浏览器功能,可以加载并执行页面的JavaScript,相当于轻量级的Selenium,使用起来更简单:

首先安装库:

pip install requests-html

然后用以下代码抓取:

from requests_html import HTMLSession

# 创建会话
session = HTMLSession()
url = "https://chartink.com/screener/test-121377"
# 发送请求
r = session.get(url)
# 执行页面JavaScript,渲染动态内容
r.html.render()

# 找到表格并提取数据
table = r.html.find('table', first=True)
if table:
    # 遍历表格行
    for row in table.find('tr'):
        # 获取每行的单元格
        cells = row.find('td')
        if cells:
            # 打印每行的文本内容
            print([cell.text.strip() for cell in cells])

3. 提取页面内嵌的JS变量数据

有些网站会把初始数据直接内嵌在页面的<script>标签里(比如作为全局变量),你可以用BeautifulSoup提取这部分内容,再解析成JSON:

import requests
from bs4 import BeautifulSoup
import json

url = "https://chartink.com/screener/test-121377"
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

# 查找包含表格数据的script标签(需要根据实际页面调整关键词)
script_tag = soup.find('script', text=lambda t: t and 'screener_results' in t)
if script_tag:
    # 提取JSON字符串(这里的处理逻辑需要根据实际JS代码调整)
    data_str = script_tag.text.split('=')[1].strip().rstrip(';')
    # 解析成JSON对象
    table_data = json.loads(data_str)
    # 处理数据
    print(table_data)

这个方法需要你手动查看页面的JS代码,找到存储数据的变量名,不同网站的写法会有差异。


内容的提问来源于stack exchange,提问作者leaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:36:50