docs: def _extract_game_info(self, games):
          """
          Parse game information from all boxscores.
  
          Find the major game information for all boxscores listed on a
          particular boxscores webpage and return the results in a list.
  
          Parameters
          ----------
          games : generator
              A generator where each element points to a boxscore on the parsed
              boxscores webpage.
  
          Returns
          -------
          list
              Returns a ``list`` of dictionaries where each dictionary contains
              the name and abbreviations for both the home and away teams, and a
              link to the game's boxscore.
          """
          all_boxscores = []
  
          for game in games:
              details = self._get_team_details(game)
              away_name, away_abbr, away_score, home_name, home_abbr, \
                  home_score = details
              boxscore_url = game('td[class="right gamelink"] a')
              boxscore_uri = self._get_boxscore_uri(boxscore_url)
              losers = [l for l in game('tr[class="loser"]').items()]
              winner = self._get_team_results(game('tr[class="winner"]'))
              loser = self._get_team_results(game('tr[class="loser"]'))
              # Occurs when the boxscore format is invalid and the game should be
              # skipped to avoid conflicts populating the game information.
              if (len(losers) != 2 and loser and not winner) or \
                 (len(losers) != 2 and winner and not loser):
                  continue
              # Occurs when information couldn't be parsed from the boxscore or
              # the game hasn't occurred yet. In this case, the winner should be
              # None to avoid conflicts.
              if not winner or len(losers) == 2:
                  winning_name = None
                  winning_abbreviation = None
              else:
                  winning_name, winning_abbreviation = winner
              # Occurs when information couldn't be parsed from the boxscore or
              # the game hasn't occurred yet. In this case, the winner should be
              # None to avoid conflicts.
              if not loser or len(losers) == 2:
                  losing_name = None
                  losing_abbreviation = None
              else:
                  losing_name, losing_abbreviation = loser
              game_info = {
                  'boxscore': boxscore_uri,
                  'away_name': away_name,
                  'away_abbr': away_abbr,
                  'away_score': away_score,
                  'home_name': home_name,
                  'home_abbr': home_abbr,
                  'home_score': home_score,
                  'winning_name': winning_name,
                  'winning_abbr': winning_abbreviation,
                  'losing_name': losing_name,
                  'losing_abbr': losing_abbreviation
              }
              all_boxscores.append(game_info)
          return all_boxscores