Как я могу собрать данные из URL-адреса в целевом URL-адресе и изменить все в один фрейм данных в Python? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь очистить точки данных с одной веб-страницы (A), но затем соскрести данные с собственной веб-страницы каждой отдельной точки данных и объединить все данные в один фрейм данных для удобства просмотра.

Этопредназначен для ежедневного фрейма данных с четырьмя столбцами: Team, Pitcher, ERA, WHIP.ЭРА и КНУТ находятся в URL конкретного кувшина.Для приведенных ниже данных мне удалось очистить имя команды, а также имя исходного кувшина и организовал оба в фрейм данных (хотя и неправильно).

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
targetUrl = 'http://www.baseball-reference.com/previews/'
targetUrl_response = requests.get(targetUrl, timeout=5)
soup = BeautifulSoup(targetUrl_response.content, "html.parser")    

teams = []
pitchers = []

for i in soup.find_all('tr'):
    if i.find_all('strong'):
        for link in i.find_all('strong'):
            if not re.findall(r'MLB Debut',link.text):
                teams.append(link.text)
            if i.find_all('a'):
                for link in i.find_all('a'):
                    if not re.findall(r'Preview',link.text):
                        pitchers.append(link.text)
print (df)

Я хотел бы добавить код, который следует за веб-страницей каждого питчера, очистить ERA и WHIP, а затем изменить данные в том же фрейме данных, что и имя команды и питчера.Это вообще возможно?

Вывод на данный момент:

                     0
Aaron Sanchez      TOR
CC Sabathia        NYY
Steven Matz        NYM
Zach Eflin         PHI
Lucas Giolito      CHW
Eduardo Rodriguez  BOS
Brad Keller        KCR
Adam Plutko        CLE
Julio Teheran      ATL
Jon Lester         CHC
Clayton Kershaw    LAD
Zack Greinke       ARI
Jon Gray           COL
Drew Pomeranz      SFG

1 Ответ

0 голосов
/ 25 июня 2019

Немного вещей (посмотрите, что я там делал :-)) страницы sports-reference.com являются динамическими. Вы можете получить некоторые таблицы прямо, но если есть несколько таблиц, вы найдете их в тегах комментариев в HTML-источнике. Так что это может быть проблемой позже, если вы хотите больше данных со страницы.

Во-вторых, я заметил, что вы тянете теги <tr>, что означает, что есть теги <table>, и панды могут выполнять за вас тяжелую работу, а не выполнять итерацию по bs4. Это простая pd.read_html() функция. ОДНАКО, он не будет вытягивать эти ссылки, только строго текст. Так что в этом случае итерация с BeautifulSoup - это то, что нужно (я просто упомяну это для дальнейшего использования).

Еще есть над чем поработать, так как у пары парней не было эры ссылок / возврата или кнута. И вам также придется учитывать, что если парень торгуется или поменяет лигу, может быть несколько ERA за один и тот же сезон 2019 года. Но это должно помочь вам:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
targetUrl = 'http://www.baseball-reference.com/previews/'
targetUrl_response = requests.get(targetUrl, timeout=5)
soup = BeautifulSoup(targetUrl_response.content, "html.parser")    

teams = []
pitchers = []
era_list = []
whip_list = []

for i in soup.find_all('tr'):
    if i.find_all('strong'):
        for link in i.find_all('strong'):
            if not re.findall(r'MLB Debut',link.text):
                teams.append(link.text)
            if i.find_all('a'):
                for link in i.find_all('a'):
                    if not re.findall(r'Preview',link.text):
                        try:
                            url_link = link['href']
                            pitcher_table = pd.read_html(url_link)[0]
                            pitcher_table = pitcher_table[(pitcher_table['Year'] == '2019') & (pitcher_table['Lg'].isin(['AL', 'NL']))]

                            era = round(pitcher_table.iloc[0]['ERA'],2)
                            whip = round(pitcher_table.iloc[0]['WHIP'],2)

                        except:
                            era = 'N/A'
                            whip = 'N/A'
                        pitchers.append(link.text)
                        era_list.append(era)
                        whip_list.append(whip)
                        print ('%s\tERA: %s\tWHIP: %s' %(link.text, era, whip))

df = pd.DataFrame(list(zip(pitchers, teams, era_list, whip_list)), columns = ['Pitcher', ',Team', 'ERA', 'WHIP'])
print (df)

Выход:

print (df)
              Pitcher Team    ERA  WHIP
0      Walker Lockett  NYM  23.14  2.57
1        Jake Arrieta  PHI   4.12  1.38
2         Logan Allen  SDP      0  0.71
3     Jimmy Yacabonis  BAL    4.7  1.44
4     Clayton Richard  TOR   7.46  1.74
5      Glenn Sparkman  KCR   3.62  1.25
6        Shane Bieber  CLE   3.86  1.08
7       Carson Fulmer  CHW   6.35  1.94
8         David Price  BOS   3.39   1.1
9        Jesse Chavez  TEX    N/A   N/A
10  Jordan Zimmermann  DET   6.03  1.37
11       Max Scherzer  WSN   2.62  1.06
12    Trevor Richards  MIA   3.54  1.25
13          Max Fried  ATL   4.03  1.34
14     Adbert Alzolay  CHC   2.25  0.75
15     Marco Gonzales  SEA   4.38  1.37
16        Zach Davies  MIL   3.06  1.36
17    Trevor Williams  PIT   4.12  1.19
18        Gerrit Cole  HOU   3.54  1.02
19        Blake Snell  TBR    4.4  1.24
20        Kyle Gibson  MIN   4.18  1.25
21      Chris Bassitt  OAK   3.64  1.17
22      Jack Flaherty  STL   4.24  1.18
23     Ross Stripling  LAD   3.08  1.17
24         Robbie Ray  ARI   3.87  1.34
25   Chi Chi Gonzalez  COL    N/A   N/A
26  Madison Bumgarner  SFG   4.28  1.24
27        Tyler Mahle  CIN   4.17   1.2
28      Andrew Heaney  LAA   5.68  1.14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...