【问题标题】:Python script extract from HTML从 HTML 中提取 Python 脚本
【发布时间】:2016-04-12 10:49:17
【问题描述】:

我正在编写一个扫描一组链接的脚本。在每个链接中,脚本会在表格中搜索一行。一旦找到,它会增加变量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

在select() 调用之后调试 team_rows 是空的,我也尝试了不同的标签。例如我试过soup.select(".scroll-wrapper div") 我试过soup.select("#DataTables_Table_0_wrapper div") 都没有返回任何东西

【问题讨论】:

  • 我不认为string = str(a) 是你想要的。它返回一个元素的文本表示。
  • @mic4ael 我错了 .get 将字符串作为输入吗?或者这就是你的意思?

标签: python html beautifulsoup python-requests extract


【解决方案1】:

选择器

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

在<no-footer> 元素下的任何位置选择<tr> 元素在<dataTable> 元素下的任何位置......等等。

我认为真正的“数据表可滚动数据表无页脚”是您.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">

正确的选择器仍然是我最初建议的选择器。

【讨论】:

  • 我认为你是对的,但这并没有解决根本问题
  • 请查看帖子我已经更新了代码并找到了一个新的地方我认为错误是
  • @audiodude 很好的解释。发布了一个更注重实际的答案,看看吧。
【解决方案2】:

尽管建议的选择器对我不起作用,但@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]")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2016-08-27
    • 2019-07-26
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多