python - 从网站上的表中解析数据,其中零条目输入为 "-"

标签 python html web-scraping beautifulsoup

Screenshot of Toronto Raptors Stats from nba.com 我正在尝试从 nba.com 上找到的表中解析数据,但问题是零条目未输入为“0”,而是输入为“-”。

如果条目不为零,则它包含在具有特定类的 td 标记中(例如 class="pts"25 表示点)。如果条目为零,则 td 标记没有类,而只是简单的 -。

我正在使用漂亮的 soup 库来解析这些数据,我尝试找到所有的 td 标签并使用 if 语句将“0”而不是“-”字符附加到我的数组中(参见代码)。当我以 CSV 格式打印出球员姓名、号码、玩过的游戏和分数时,这些分数没有打印在正确的球员旁边。

points = soup.find_all("td")

for point in points:

    if point.has_attr("class") and point["class"][0]=="pts":
        points_array.append(point.text)
    elif point.text=="—":
        points_array.append("0")
    else:
        pass

我希望程序应该跳过任何没有 class="pts"或文本属性等于 "-"的 td 标签。在“for point in points”for 循环之后,points_array 应具有与其他三个数组(names_array、numbers_array、games_array)相同数量的元素,并且所有玩家的统计数据应位于相应数组中的相同索引处。

最佳答案

您可以使用 zip 连接列表,替换文本和相邻兄弟组合器以确保点的列表长度与其他列表长度相同,因为您将始终采用相邻列值,而不管类/无类。

import csv, requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.nba.com/raptors/stats')
soup = bs(r.content, 'lxml')

with open("nba.csv", "w", encoding="utf-8-sig", newline='') as csv_file:
    w = csv.writer(csv_file, delimiter = ",", quoting=csv.QUOTE_MINIMAL)
    w.writerow(['Name','Number','Games Played','Points'])

    for name, number, games, points in zip(soup.select('.playerName a'), soup.select('.playerNumber'), soup.select('td.gp'), soup.select('td.gp + td')):
        w.writerow([name.text, number.text, games.text, points.text.replace('—','0')])

关于python - 从网站上的表中解析数据,其中零条目输入为 "-",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58736530/

相关文章:

python - 在 if 语句条件中使用 "or"

python - 为什么 subprocess.call 仅当参数在数组中分隔时才适用于任何字符串?

python - 如何计算不同基数中数字的位数?

html - 更改响应式 HTML 通讯模板的宽度 来自 Charles Mudy

python - 使用 Scraperwiki (Python) 抓取 Google 图表脚本

javascript - 使用 R 在搜索后面抓取 asp javascript 分页表

python - 删除 matplotlib boxplot 传单的边缘宽度

html - Ionic 4 html 重叠,css 不处理填充

javascript - 如何按范围移动文本

python - 通过 Web Scraping Python 检索 Imgur 图像链接