使用 BeautifulSoup 进行网页抓取,无法在 html 中找到 table

Webscraping with BeautifulSoup, can't find table within html

我正在尝试从该站点抓取主要 table:https://www.atptour.com/en/stats/leaderboard?boardType=serve&timeFrame=52Week&surface=all&versusRank=all&formerNo1=false 这是我的代码:

import requests
from bs4 import BeautifulSoup, Comment
import pandas as pd

url = "https://www.atptour.com/en/stats/leaderboard?boardType=serve&timeFrame=52Week&surface=all&versusRank=all&formerNo1=false"
request = requests.get(url).text

soup = BeautifulSoup(request, 'lxml')


divs = soup.findAll('tbody', id = 'leaderboardTable')

print(divs)

然而,这是唯一的输出:

如何访问 html 的其余部分?当我搜索汤时,它似乎不存在。我还附上了我正在寻求访问的 html 的图片。任何帮助表示赞赏。谢谢!

您的代码按预期工作。您正在解析的HTML在table.

下没有任何数据
$ wget https://www.atptour.com/en/stats/leaderboard\?boardType\=serve\&timeFrame\=52Week\&surface\=all\&versusRank\=all\&formerNo1\=false -O page.html

$ grep -C 3 'leaderboardTable' page.html
                         class="stat-listing-table-content no-pagination">
                        <table class="stats-listing-table">
                            <!-- TODO: This table head will only appear on DESKTOP-->
                            <thead id="leaderboardTableHeader" class="leaderboard-table-header">


                            </thead>
                            <tbody id="leaderboardTable"></tbody>
                        </table>
                    </div>

您显示了包含数据的开发人员视图的屏幕截图。我猜想有一个 Javascript 在加载 后修改 HTML 并放入行中。您的浏览器能够 运行 此 Javascript,因此您会看到这些行。 requests 当然 运行 没有任何脚本,它只下载 HTML.

您可以在浏览器中执行“另存为”以获得重用 HTML,或者您将不得不使用更高级的 Web 模块,例如可以 运行 脚本的 Selenium。

有一个 ajax 请求获取该数据,但是它被 cloudscraper 阻止了。有一个包可以绕过它,但似乎不适用于此站点。

您现在需要做的是使用类似 Selenium 的东西让页面先呈现,然后拉取数据。

from selenium import webdriver
import pandas as pd

browser = webdriver.Chrome('C:/chromedriver_win32/chromedriver.exe')
browser.get("https://www.atptour.com/en/stats/leaderboard?boardType=serve&timeFrame=52Week&surface=all&versusRank=all&formerNo1=false")

df= pd.read_html(browser.page_source, header=0)[0]
browser.close()

输出: