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

如何用BeautifulSoup获取完整HTML?爬取Elo评级页仅得顶层元素求助

问题:无法爬取世界足球Elo评级网页的嵌套内容

我是网页爬取新手,在为数据科学项目爬取世界足球Elo评级网页时遇到问题:仅能获取顶层HTML元素,无法获取嵌套元素,获取到的内容如下:

<!DOCTYPE html>

<html lang="en"><head><title>World Football Elo Ratings</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta content="Ratings for national football teams based on the Elo rating system." name="description"/>
<meta content="football, ratings, Elo, rankings, national, international, soccer, teams" name="keywords"/>
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>
<link href="scripts/slick.grid.css" rel="stylesheet" type="text/css"/>
<link href="scripts/dygraph.css" rel="stylesheet" type="text/css"/>
<script src="scripts/dygraph.js" type="text/javascript"></script>
<script src="scripts/jquery.js" type="text/javascript"></script>
<script src="scripts/slick.core.js" type="text/javascript"></script>
<script src="scripts/slick.grid.js" type="text/javascript"></script>
<script src="scripts/cldr.js" type="text/javascript"></script>
<script src="scripts/event.js" type="text/javascript"></script>
<script src="scripts/supplemental.js" type="text/javascript"></script>
<script src="scripts/globalize.js" type="text/javascript"></script>
<script src="scripts/number.js" type="text/javascript"></script>
<script src="scripts/date.js" type="text/javascript"></script>
<script src="scripts/ratings.js" type="text/javascript"></script>
<link href="scripts/css.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div class="main" id="main">
<h1 class="mainheader" id="mainheader"></h1>
<div class="topnav" id="topnav"></div>
<h3 class="subheader" id="subheader"></h3>
<div class="maindiv" id="maindiv"></div>
</div>
<div class="mainmenu" id="mainmenu"></div>
<div class="mainloader">
<div class="loadheader" id="loadheader">World Football Elo Ratings</div>
</div>
</body>
</html>

我的爬取代码如下:

import requests
from bs4 import BeautifulSoup
import pprint

response = requests.get('https://www.eloratings.net/')

soupObject = BeautifulSoup(response.text, 'html.parser')

pprint.pprint(soupObject)

我初步认为大部分HTML由JavaScript生成,但不确定是否如此,也不知道该如何解决,恳请提供相关建议。

解决方案建议
  • 动态渲染判断:你的判断是对的,页面核心内容确实由JavaScript动态生成。你拿到的空div(如maindiv、mainmenu)都是占位符,后续由ratings.js等脚本填充数据。

  • 方案一:直接抓取后端API(推荐)
    打开浏览器开发者工具(F12),切换到「网络」标签页,刷新页面后筛选「XHR」请求,就能找到页面加载数据的接口。这类接口返回JSON格式的结构化数据,比解析HTML效率更高。
    操作步骤:

    1. 刷新页面,找到类似get_ratings.php的请求
    2. 复制请求URL和参数,用requests直接请求该接口,即可获取原始评级数据
  • 方案二:使用无头浏览器渲染页面
    若不想查找API,可使用selenium或playwright模拟浏览器加载页面,等待JavaScript执行完成后再获取渲染后的HTML。示例代码(selenium):

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from bs4 import BeautifulSoup
    import pprint
    
    # 初始化无头Chrome浏览器(需提前安装ChromeDriver)
    options = webdriver.ChromeOptions()
    options.add_argument('--headless=new')
    driver = webdriver.Chrome(options=options)
    
    driver.get('https://www.eloratings.net/')
    
    # 等待核心内容加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'maindiv'))
    )
    
    # 获取渲染后的完整HTML
    rendered_html = driver.page_source
    soup = BeautifulSoup(rendered_html, 'html.parser')
    pprint.pprint(soup)
    
    driver.quit()
    
  • 方案三:分析本地JavaScript逻辑
    页面的ratings.js包含数据加载和渲染逻辑,可分析该脚本找到数据来源,但此方法对新手门槛较高,不优先推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:05:22