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/