从脚本HTML提取的脚本

问题描述:

我正在编写一个脚本来扫描一组链接。在每个链接中,脚本在表格中搜索一行。一旦找到,它会增加变量total_rank,这是在每个网页上找到的总和。排名等于行号。从脚本HTML提取的脚本

的代码看起来是这样的,并输出零:

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")正在返回什么

+1

我不认为'string = str(a)'是你想要的。它返回一个元素的文本表示。 – mic4ael

+0

@ mic4ael我错了.get需要一个字符串作为输入?或者你在说什么? –

的选择

".tr-table datatable scrollable dataTable no-footer tr" 

选择一个<tr>元素的任何地方<no-footer>元素下<dataTable>元素的任何地方....等。

我认为真的“数据表可滚动dataTable no-footer”是在您的.tr-table?那么在那种情况下,他们应该和第一类人合并一段时间。所以我相信最终的正确选择是:

".tr-table.datatable.scrollable.dataTable.no-footer tr" 

更新:新的选择看起来是这样的:

".tr-table.datatable.scrollable.dataTable.no-footer table" 

这里的问题是,第一部分,.tr-table.datatable ...指表本身。假设你试图得到这个表的行:

<table class="tr-table datatable scrollable dataTable no-footer" id="DataTables_Table_0" role="grid"> 

适当的选择器仍然是我最初建议的选择器。

+0

我认为你是正确的,但是没有解决底层问题 –

+0

请检查我的帖子我已经更新了代码,发现了一个新的地方我认为错误是 –

+0

我已经更新了我的答案,PTAL – audiodude

虽然建议的选择器不适合我,但@ audiodude的答案是正确的。

您不需要检查table元素的每一个类。这里是工作的选择:

team_rows = soup.select("table.datatable tr") 

另外,如果你需要找到Oklahoma表里面 - 你不必在表中的每一行和单元的迭代。只需直接搜索特定的细胞,并获得先前包含等级:

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 

另外请注意,你是不是你应该抽出更多的统计链接 - 看起来像玩家资料的链接,因为你不应该遵循专注于球队统计。这里有一种方法可以获得Team Stats链接:

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]")]