Соскоб веб-таблицы данных, чтобы преуспеть - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь очистить данные с сайта, чтобы преуспеть. сейчас он работает нормально, но когда он ищет кого-то вроде Серхио Родригеса, появляется несколько имен (https://basketball.realgm.com/search?q=Sergio+Rodriguez), поэтому он пропускает имя и выбрасывает «Нет международной таблицы для Серхио Родригеса». Как выбрать тот, который играл в НБА из этого списка, и продолжить с чистого листа для каждой игры и таблицы расширенной статистики, чтобы преуспеть? в этом случае Родригес является вторым при поиске его имени.

import requests
from bs4 import BeautifulSoup
import pandas as pd


playernames=['Carlos Delfino', 'Sergio Rodriguez']

result = pd.DataFrame()
for name in playernames:

    fname=name.split(" ")[0]
    lname=name.split(" ")[1]
    url="https://basketball.realgm.com/search?q={}+{}".format(fname,lname)
    response = requests.get(url)

    soup = BeautifulSoup(response.content, 'html.parser')


    try:
        table1 = soup.find('h2',text='International Regular Season Stats - Per Game').findNext('table')
        table2 = soup.find('h2',text='International Regular Season Stats - Advanced Stats').findNext('table')

        df1 = pd.read_html(str(table1))[0]
        df2 = pd.read_html(str(table2))[0]

        commonCols = list(set(df1.columns) & set(df2.columns))
        df = df1.merge(df2, how='left', on=commonCols)
        df['Player'] = name

    except:
        print ('No international table for %s.' %name)
        df = pd.DataFrame([name], columns=['Player'])

    result = result.append(df, sort=False).reset_index(drop=True)

cols = list(result.columns)
cols = [cols[-1]] + cols[:-1]
result = result[cols]
result.to_csv('international players.csv', index=False)

1 Ответ

1 голос
/ 23 января 2020

Проверьте URL страницы, которую вы получаете, поиск, который приводит к одному совпадению, направляет вас к

https://basketball.realgm.com/player/{player-name}/Summary/{player-id}

, но при наличии более одного результата вы получаете

https://basketball.realgm.com/search?q={player-name}

Напишите функцию парсера для обоих URL-адресов, например (псевдокод)

...
for name in playernames:
    fname=name.split(" ")[0]
    lname=name.split(" ")[1]
    url="https://basketball.realgm.com/search?q={}+{}".format(fname,lname)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    # check the response url
    if (response.url == "https://basketball.realgm.com/search..."):
        # parse the search results, finding the players you want
        ... get urls from the table ...
        soup.table...  # etc.
        foreach url in table:
            response = requests.get(player_url)
            soup = BeautifulSoup(response.content, 'html.parser')
            # call the parse function for a player page
            ...
            parse_player(soup)
    else: # we have a player page
        # call the parse function for a player page, same as above
        ...
        parse_player(soup)
    ...

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

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