python - 在 BS4 中对多个容器使用循环时,如何从容器中提取多行?

标签 python web-scraping beautifulsoup

我正在尝试抓取http://www.rotoworld.com/teams/injuries/nba/all/了解当前 NBA 伤病数据。我编写了一个 python 脚本(如下),它正确地提取团队和每个团队容器的第一行数据,但不是每个容器的所有玩家。我对Python很陌生,但花了很多时间试图找到解决方案,但不幸的是没有找到任何解决问题的方法。我希望这不是一个太新手的问题!

有人可以帮我提取每个球队的所有球员数据吗?

此外,如果有任何关于改进我的脚本的其他建议,请告诉我!我很高兴终于开始使用 Python 工作!

提前谢谢您!

import requests
from bs4 import BeautifulSoup as bs


#Define URL to fetch
url = 'http://www.rotoworld.com/teams/injuries/nba/all/'

#Make requests
data = requests.get(url)

# To force American English (en-US) when necessary
headers = {"Accept-Language": "en-US, en;q=0.5"}

#Create BeautifulSoup object
soup = bs(data.text, 'html.parser')

# Lists to store scraped data
teams = []
players = []
reports = []
return_dates = []
injury_dates = []
injuries = []
positions = []
statuses = []

# Extract data from individual containers

    for container in team_containers:

    # Team Name
    team = container.a.text
    teams.append(team)

    # Player Name [First, Last]
    player = container.table.a.text
    players.append(player)

    # Player Report
    report = container.find('div', attrs = { 'class':'report'}).text
    reports.append(report)

    # Player Return
    return_date = container.find('div', attrs = { 'class':'impact'}).text
    return_dates.append(return_date)

    # Player Injury Dates
    injury_date = container.find('div', attrs = { 'class':'date'}).text
    injury_dates.append(injury_date)

    # Player Injury Details
    injury = container.find('div', attrs = { 'class':'playercard'}).span.text
    injuries.append(injury)

    # Player Position
    position= container.table.find_all('td')[9].text
    positions.append(position)

    # Player Status
    status = container.table.find_all('td')[10].text
    statuses.append(status)

import pandas as pd

test_df = pd.DataFrame({'team': teams,
                       'player': players,
                       'report': reports,
                       'return_date': return_dates,
                       'injury_date': injury_dates,
                       'injury': injuries,
                       'position': positions,
                       'status': statuses})
print(test_df.info())
test_df

当前结果: * 27 个容器 - 每队一个(如果球队受伤人数超过 1 人),包含球队表中的第一位球员 * 记录姓名、报告、POS、日期、伤害、返回字段

预期结果: * 27 个容器 - 每队一个(如果球队受伤人数超过 1 人),包含球队表中的所有球员 * 姓名、报告、POS、日期、伤害、返回作为标题行和字段记录

最佳答案

下面的代码选择第一个元素

player = container.table.a.text

你需要循环来获取所有玩家

# Player Name [First, Last]
for player in container.select('table a'):
    if player.text: # skip "a img"
        players.append(player.text)

关于python - 在 BS4 中对多个容器使用循环时,如何从容器中提取多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54033159/

相关文章:

javascript - 每次 $() 选择某些内容时添加一个字符串

javascript - Python Beautiful Soup(HTML解析)

python - "%11f"Python 中的符号打印太多数字

python删除字典中的重复值并更改键

python - 使用 BeautifulSoup 进行 SRE 匹配时无法访问元素

python - 如何从网络链接列表中检索 URL 和 URL 中的数据

python - Tripadvisor 抓取 'moreLink'

python - 如何在 Dask 中进行行处理和项目分配

python - Gunicorn docker 化后找不到静态文件

python - 为什么我的 XPath 选择文本不起作用?