Как вернуть несколько «бомбардиров» при поиске футбольных результатов с помощью Python?

#python #web-scraping

Вопрос:

Я всего несколько часов изучаю Python, так что, пожалуйста, полегче со мной! Я просто хочу соскрести результаты и бомбардиров с веб-сайта, я смог это сделать, однако я получаю только одного бомбардира (если он есть!), Когда есть несколько забитых мячей, я получаю только первого. Я думаю, что пытаюсь найти несколько бомбардиров в разделе «# Домашние бомбардиры».

Мой код:

 from bs4 import BeautifulSoup
import requests
import pandas as pd

url = "https://www.skysports.com/football-results"

match_results = {}
match_details = {}
match_no = 0

response = requests.get(url)
data = response.text
soup = BeautifulSoup(data,'html.parser')
matches = soup.find_all('div',{'class':'fixres__item'})

for match in matches:
    try:
        match_url_get = match.find('a',{'class':'matches__item matches__link'}).get('href')
        match_url = match_url_get if match_url_get else "unknown"
        event_id  = match_url[-6:]
        
        match_response = requests.get(match_url)
        match_data = match_response.text
        match_soup = BeautifulSoup(match_data,'html.parser')
        
        # Match Details
        match_date = match_soup.find('time',{'class':'sdc-site-match-header__detail-time'}).text
        match_location = match_soup.find('span',{'class':'sdc-site-match-header__detail-venue'}).text
        match_info = match_soup.find('p',{'class':'sdc-site-match-header__detail-fixture'}).text
        
        # Home Scores amp; Team
        home_details = match_soup.find_all('span',{'class':'sdc-site-match-header__team-name sdc-site-match-header__team-name--home'})
        for home_detail in home_details:    
            home_team = home_detail.find('span',{'class':'sdc-site-match-header__team-name-block-target'}).text
            
        home_score_get = match_soup.find('span',{'class':'sdc-site-match-header__team-score-block','data-update':'score-home'})
        home_score = home_score_get.text if home_score_get else "none"
        
        # Home Scorers
        home_scorer_details = match_soup.find_all('ul',{'class':'sdc-site-match-header__team-synopsis','data-update':'synopsis-home'})
        for home_scorer_detail in home_scorer_details:    
            goal_scorer_get = home_scorer_detail.find('li',{'class':'sdc-site-match-header__team-synopsis-line'})
            goal_scorer = goal_scorer_get.text if goal_scorer_get else "none"
            goal_score_minute_get = home_scorer_detail.find('span',{'class':'sdc-site-match-header__event-time'})
            goal_score_minute = goal_score_minute_get.text if goal_score_minute_get else "none"

         # Away Scores amp; Team   
        away_details = match_soup.find_all('span',{'class':'sdc-site-match-header__team-name sdc-site-match-header__team-name--away'})
        for away_detail in away_details:    
            away_team = away_detail.find('span',{'class':'sdc-site-match-header__team-name-block-target'}).text
        away_score_get = match_soup.find('span',{'class':'sdc-site-match-header__team-score-block','data-update':'score-away'})
        away_score = away_score_get.text if away_score_get else "none"
        
        # Home Scorers
        away_scorer_details = match_soup.find_all('ul',{'class':'sdc-site-match-header__team-synopsis','data-update':'synopsis-away'})
        for away_scorer_detail in away_scorer_details:    
            away_goal_scorer_get = away_scorer_detail.find('li',{'class':'sdc-site-match-header__team-synopsis-line'})
            away_goal_scorer = away_goal_scorer_get.text if away_goal_scorer_get else "none"
            away_goal_score_minute_get = away_scorer_detail.find('span',{'class':'sdc-site-match-header__event-time'})
            away_goal_score_minute = away_goal_score_minute_get.text if away_goal_score_minute_get else "none"
        
        print("Match: ",event_id , "Match Date:", match_date, "Match Location:", match_location, "Match Info:", match_info, "nResult: ", home_team, home_score, away_team, away_score)
        print("Home Scorer:", goal_scorer, "Minute:",goal_score_minute, "nAway Scorer:", away_goal_scorer, "Minute:",away_goal_score_minute)
        print(match_date)
        
    except:
        pass
    
    match_no =1
    match_results[match_no] = [event_id, home_team, home_score, away_team, away_score, match_url, match_date, match_location, match_info]
    match_details[match_no] = [event_id, goal_scorer, goal_score_minute, away_goal_scorer, away_goal_score_minute]
    
    

Period = "2021-22"

print("Total Matches: ", match_no)

match_results = pd.DataFrame.from_dict(match_results, orient='index', columns = ['Event_ID:', 'Home Team:','Home Score:','Away Team:','Away Score:','Link:','Match Date:','Match Location:','Match Info:'])
match_results.to_csv("Python/FL/Premier League Results (SkySports.com) "   Period   ".csv")

match_details = pd.DataFrame.from_dict(match_details, orient='index', columns = ['Event_ID:', 'Home Goal:','Home Goal Minute:','Away Goal:','Away Goal Minute:'])
match_details.to_csv("Python/FL/Premier League Details (SkySports.com) "   Period   ".csv")
 

Так что бит, который работает неправильно, это:

         # Home Scorers
        home_scorer_details = match_soup.find_all('ul',{'class':'sdc-site-match-header__team-synopsis','data-update':'synopsis-home'})
        for home_scorer_detail in home_scorer_details:    
            goal_scorer_get = home_scorer_detail.find('li',{'class':'sdc-site-match-header__team-synopsis-line'})
            goal_scorer = goal_scorer_get.text if goal_scorer_get else "none"
            goal_score_minute_get = home_scorer_detail.find('span',{'class':'sdc-site-match-header__event-time'})
            goal_score_minute = goal_score_minute_get.text if goal_score_minute_get else "none"
 

Есть идеи, как я могу вернуть несколько строк для этого бита?!

Заранее спасибо 🙂

Комментарии:

1. Ваш ожидаемый результат?

2. Если есть 3 забитых гола, то 3 строки, в каждой из которых указано Имя и забитая минута. В настоящее время я занимаю только один ряд.

3. Проверьте наличие циклов, похоже, вы будете перезаписывать goal_scorer_get переменную в каждом цикле.

4. Да, это бит с надписью «Так что бит, который работает неправильно, это:» @Xitiz

5. @Quixotic22 Я задавался этим вопросом, но записывается первый бомбардир, а не последующие бомбардиры, так что это не переписывание, это просто не ищет никаких дополнительных (или не находит их), но класс идентичен, поэтому я не вижу, как он не может их найти. И я подумал, что «для home_scorer_detail в home_scorer_details:» заставит его искать больше…

Ответ №1:

home_scorer_details есть только 1 пункт, сам неупорядоченный список.

Чтобы получить все результаты, вам нужно получить элементы в этом списке.

Следующий код, который является довольно грубым, создаст список словарей, в котором в каждом словаре будет указано имя бомбардира и минута(минуты), которые они забили.

Вы могли бы использовать аналогичный код, чтобы получить всех бомбардиров на выезде.

Как я уже сказал, этот код грубый и нуждается в доработке, но он должен дать вам начало.

         # Home Scorers
        home_scorer_details = match_soup.find_all('ul',{'class':'sdc-site-match-header__team-synopsis','data-update':'synopsis-home'})
        home_scorers = []

        for home_scorer_detail in home_scorer_details[0].find_all('li'):    
            goal_scorer = home_scorer_detail.text
            goal_score_minute_get = home_scorer_detail.find('span',{'class':'sdc-site-match-header__event-time'})
            goal_score_minute = goal_score_minute_get.text if goal_score_minute_get else "none"
            home_scorers.append({'scorer': goal_scorer, 'minute': goal_score_minute})
        print(home_scorers)