美汤find_all没有找到页面中所有匹配的元素

问题描述 投票:0回答:1

我想实现什么目标?

我正在尝试从此网页中抓取“玩家射击”表。更具体地说,我想将 stats_shooting 表中的 tr 标签作为列表返回(列表中每个元素一个 tr)。

到目前为止我做了什么?

我使用下面的块返回网页:

# Request page
all_players_shooting_url = "https://fbref.com/en/comps/9/shooting/Premier-League-Stats"
html = requests.get(all_players_shooting_url)
assert html.status_code == 200, f"Status code of {html.status_code} was returned."
soup = bs(html, 'html.parser')

我在哪里遇到了问题/以及我做了什么来解决这些问题

然后我尝试了多种方法来获取我需要的数据:

简单的查找所有方法 - 这给了我外部信息,但我无法进一步搜索它来获取 tr 的

granular_search = soup.find_all("div", {"id": "all_stats_shooting"})
print(f"Granular search returns {len(granular_search)} results. Expected 1.")

从页面暴力返回所有表格标签。这不会返回我关心的表...

broad_search = soup.find_all("table", recursive=True)
print(f"Broad search returns {len(broad_search)} results. Expected 3.")

使用 CSS 选择器返回表格(我实际上得到了一些东西......),但无法进一步搜索以获取 tr 的......

css_search = soup.select("#all_stats_shooting")
print(f"CSS search returns {len(css_search)} results. Expected 1.")
further_search = css_search[0].find_all("tr")
print(f"Further search returns {len(further_search)} results. Expected > 0.")

我可以尝试返回带有 tr 标签的所有元素,但它又只返回前两个表...

tr_search = soup.find_all('tr')
print(f"Tr search returns {len(tr_search)} results. Expected > 44")

请注意:我还使用 Selenium 开发了一个解决方案。它可以工作,但速度慢且不稳定。考虑到这一点,一些现有的答案,例如这个并不能真正解决我的问题。

python web-scraping beautifulsoup
1个回答
0
投票

这里的主要问题是,您尝试查找的表存储在comments中,因此您必须先将其注释掉:

soup = bs(html.text.replace('<!--','').replace('-->',''), 'html.parser')

然后仅选择数据行,调整您的

css selector
:

soup.select("#all_stats_shooting table tr:has(td)")

要抓取表格并将其直接存储到数据框,请使用 pandas - 检查并调整以下问题如何通过 id 从 fbref 网站提取隐藏表格?

© www.soinside.com 2019 - 2024. All rights reserved.