使用 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()
输出:
我正在尝试从该站点抓取主要 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()
输出: