find_elements_by_xpath 的长度不正确

0 投票
2 回答
41 浏览
提问于 2025-04-13 17:32

在下面的链接中,我想要统计2023-24常规赛表格中的比赛总数。

https://www.basketball-reference.com/players/j/jokicni01/gamelog/2024

我把这些元素的变量设置为total_games。我的问题是,当我打印len(total_games)时,输出的结果是113。

total_games = driver.find_elements_by_xpath('//tbody/tr[@id and @data-row]')
print(len(total_games))

我手动检查了页面上的元素,并搜索了//tbody/tr[@id and @data-row],结果显示只有66条记录(截至2024年3月19日的准确数据,随着赛季的进行会增加,但总数永远不会超过82)。有人能告诉我,当我在PyCharm中运行这个时,额外的那些记录是从哪里来的吗?

我还尝试使用total_games = driver.find_elements(By.XPATH, '//tbody/tr[@id and @data-row]'),但结果还是一样。我还试着用下面的两行代码让它更具体,但使用这些代码时,PyCharm返回的total_games长度为0。在这两种情况下,手动检查页面时,结果都是正确的。

total_games = driver.find_elements(By.XPATH, '//table[@id="pgl_basic"]/tbody/tr[@id and @data-row]')

还有

total_games = driver.find_elements(By.XPATH, '//tbody/tr[contains(@id, "pgl_basic") and @data-row]')

2 个回答

0

这是因为HTML里有大约8个表格。更好的做法是先找到统计表格,然后如果你想知道球员的比赛场数,就获取列的最大值,或者直接获取列的值,或者表格的长度来计算总比赛场数。

import pandas as pd

url = 'https://www.basketball-reference.com/players/j/jokicni01/gamelog/2024'
df = pd.read_html(url)[-1]
df = df[df['G'].ne('G')]

print(len(df))
0

这个问题有点奇怪。网址是对的,但不知道为什么,虽然可以看到程序访问了正确的页面,但在收集那些元素的时候,它还是从之前的页面拿数据。我加了一个叫做WebDriverWait的功能,让它在收集元素之前先等到我需要的特定元素出现,现在就正常工作了。

撰写回答