Python 脚本摘自 HTML
Python script extract from HTML
我正在编写一个扫描一组 link 的脚本。在每个 link 中,脚本在 table 中搜索一行。一旦找到,它就会增加变量 total_rank
,这是在每个网页上找到的排名总和。排名等于行号。
代码如下所示并输出零:
import requests
from bs4 import BeautifulSoup
import time
url_to_scrape = 'https://www.teamrankings.com/ncb/stats/'
r = requests.get(url_to_scrape)
soup = BeautifulSoup(r.text, "html.parser")
stat_links = []
for a in soup.select(".chooser-list ul"):
list_entry = a.findAll('li')
relative_link = list_entry[0].find('a')['href']
link = "https://www.teamrankings.com" + relative_link
stat_links.append(link)
total_rank = 0
for link in stat_links:
r = requests.get(link)
soup = BeautifulSoup(r.text, "html.parser")
team_rows = soup.select(".tr-table.datatable.scrollable.dataTable.no-footer table")
for row in team_rows:
if row.findAll('td')[1].text.strip() == 'Oklahoma':
rank = row.findAll('td')[0].text.strip()
total_rank = total_rank + rank
# time.sleep(1)
print total_rank
调试 team_rows 在 select()
调用之后是空的,我也尝试了不同的标签。例如我试过 soup.select(".scroll-wrapper div")
我试过 soup.select("#DataTables_Table_0_wrapper div")
都没有返回任何东西
选择器
".tr-table datatable scrollable dataTable no-footer tr"
在 <dataTable>
元素下的任何位置选择 <no-footer>
元素下的任何位置的 <tr>
元素....等
我认为真的 "datatable scrollable dataTable no-footer" 是 class 你的 .tr-table
吗?因此,在那种情况下,它们应该与第一个 class 一起用句点连接。所以我相信最终正确的选择器是:
".tr-table.datatable.scrollable.dataTable.no-footer tr"
更新:新的选择器如下所示:
".tr-table.datatable.scrollable.dataTable.no-footer table"
这里的问题是第一部分 .tr-table.datatable
... 指的是 table 本身。假设您正在尝试获取此 table:
的行
<table class="tr-table datatable scrollable dataTable no-footer" id="DataTables_Table_0" role="grid">
正确的选择器仍然是我最初建议的选择器。
尽管建议的选择器对我不起作用,但@audiodude 的回答是正确的。
您不需要检查 table
元素的每个 class。这是工作选择器:
team_rows = soup.select("table.datatable tr")
此外,如果您需要在 table 中找到 Oklahoma
- 您不必遍历 table 中的每一行和单元格。只需直接搜索特定单元格并获取包含排名的前一个:
rank = soup.find("td", {"data-sort": "Oklahoma"}).find_previous_sibling("td").get_text()
total_rank += int(rank) # it is important to convert the row number to int
另请注意,您正在提取比应有的更多的统计信息链接 - 看起来玩家统计信息链接不应该被访问,因为您特别关注团队统计信息。这是仅获取团队统计信息链接的一种方法:
links_list = soup.find("h2", text="Team Stats").find_next_sibling("ul")
stat_links = ["https://www.teamrankings.com" + a["href"]
for a in links_list.select("ul.expand-content li a[href]")]
我正在编写一个扫描一组 link 的脚本。在每个 link 中,脚本在 table 中搜索一行。一旦找到,它就会增加变量 total_rank
,这是在每个网页上找到的排名总和。排名等于行号。
代码如下所示并输出零:
import requests
from bs4 import BeautifulSoup
import time
url_to_scrape = 'https://www.teamrankings.com/ncb/stats/'
r = requests.get(url_to_scrape)
soup = BeautifulSoup(r.text, "html.parser")
stat_links = []
for a in soup.select(".chooser-list ul"):
list_entry = a.findAll('li')
relative_link = list_entry[0].find('a')['href']
link = "https://www.teamrankings.com" + relative_link
stat_links.append(link)
total_rank = 0
for link in stat_links:
r = requests.get(link)
soup = BeautifulSoup(r.text, "html.parser")
team_rows = soup.select(".tr-table.datatable.scrollable.dataTable.no-footer table")
for row in team_rows:
if row.findAll('td')[1].text.strip() == 'Oklahoma':
rank = row.findAll('td')[0].text.strip()
total_rank = total_rank + rank
# time.sleep(1)
print total_rank
调试 team_rows 在 select()
调用之后是空的,我也尝试了不同的标签。例如我试过 soup.select(".scroll-wrapper div")
我试过 soup.select("#DataTables_Table_0_wrapper div")
都没有返回任何东西
选择器
".tr-table datatable scrollable dataTable no-footer tr"
在 <dataTable>
元素下的任何位置选择 <no-footer>
元素下的任何位置的 <tr>
元素....等
我认为真的 "datatable scrollable dataTable no-footer" 是 class 你的 .tr-table
吗?因此,在那种情况下,它们应该与第一个 class 一起用句点连接。所以我相信最终正确的选择器是:
".tr-table.datatable.scrollable.dataTable.no-footer tr"
更新:新的选择器如下所示:
".tr-table.datatable.scrollable.dataTable.no-footer table"
这里的问题是第一部分 .tr-table.datatable
... 指的是 table 本身。假设您正在尝试获取此 table:
<table class="tr-table datatable scrollable dataTable no-footer" id="DataTables_Table_0" role="grid">
正确的选择器仍然是我最初建议的选择器。
尽管建议的选择器对我不起作用,但@audiodude 的回答是正确的。
您不需要检查 table
元素的每个 class。这是工作选择器:
team_rows = soup.select("table.datatable tr")
此外,如果您需要在 table 中找到 Oklahoma
- 您不必遍历 table 中的每一行和单元格。只需直接搜索特定单元格并获取包含排名的前一个:
rank = soup.find("td", {"data-sort": "Oklahoma"}).find_previous_sibling("td").get_text()
total_rank += int(rank) # it is important to convert the row number to int
另请注意,您正在提取比应有的更多的统计信息链接 - 看起来玩家统计信息链接不应该被访问,因为您特别关注团队统计信息。这是仅获取团队统计信息链接的一种方法:
links_list = soup.find("h2", text="Team Stats").find_next_sibling("ul")
stat_links = ["https://www.teamrankings.com" + a["href"]
for a in links_list.select("ul.expand-content li a[href]")]