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

使用BeautifulSoup解析指定网站返回空列表的问题排查

问题原因及解决方案

核心原因

该页面属于单页应用(SPA),所有卡牌内容都是通过JavaScript动态渲染生成的。你用requests.get()获取的只是页面的静态HTML骨架,里面没有实际的卡牌DOM节点,所以BeautifulSoup解析后找不到对应的div元素,自然返回空列表。

可行解决方案

方案1:用浏览器自动化工具渲染页面

用Selenium或Playwright模拟真实浏览器加载页面,等JS执行完、内容渲染完成后再解析:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

url = "https://rules.art/card/jmks-season-1-common"
# 初始化Chrome浏览器(需提前安装ChromeDriver并配置环境)
driver = webdriver.Chrome()
driver.get(url)

# 等待卡牌名称元素加载完成(替换为实际元素选择器,需自己查看页面结构)
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".card-name"))
)

# 获取渲染后的完整页面源码
soup = BeautifulSoup(driver.page_source, "html.parser")
driver.quit()

# 提取卡牌名称示例
card_name = soup.select_one(".card-name").text.strip()
print(card_name)

方案2:直接调用后端API接口

打开浏览器F12开发者工具,切换到Network标签页刷新页面,找到加载卡牌数据的XHR/Fetch请求,直接请求这个API获取结构化数据,效率比浏览器渲染更高:

import requests

# 以下为示例API地址,需自行抓包确认实际接口
api_url = "https://rules.art/api/cards/jmks-season-1-common"
resp = requests.get(api_url)
card_data = resp.json()

# 假设返回的JSON数据中name字段对应卡牌名称
print(card_data.get("name"))

注意事项

  • requests只能获取静态HTML,处理不了JS动态生成的内容,这是这类爬取问题的典型误区。
  • 调用API时要注意请求头参数,部分接口需要携带User-Agent或认证信息才能正常返回数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:20:40