如何用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效率更高。
操作步骤:- 刷新页面,找到类似
get_ratings.php的请求 - 复制请求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
相关产品推荐
相关产品推荐

