Разбор списка в 3 столбца. BeautifulSoup, Requests, Pandas, Itertools - PullRequest
1 голос
/ 10 января 2020

Python новичок снова! Я получил большую помощь по этому вопросу, но теперь я в тупике. Приведенный ниже код соскребает данные футбольного матча и результаты футбольного веб-сайта университета Лихай. Я пытаюсь разбить формат оценки ['T', '0-0 (2 OT)'] на 3 столбца 'T', '0-0,' 2 OT, но у меня возникают проблемы. Проблема заключается в этой части кода:

=> для результата в soup.findAll ("div", {'class': 'sidearm-schedule-game-result'}): => result = result.get_text (strip = True) .split (',')

Я пробовал .split (','), но это не сработало, так как он создавал ['T', '0-0 (2 OT) ) ']. Есть ли способ разбить, чем на 3 столбца 1) Т, 2) 0-0 и 3) 2 ОТ ???

Вся помощь очень ценится. Спасибо


    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    from itertools import zip_longest

    d = []
    n = []
    res = []
    op = []
    yr = []
    with requests.Session() as req:
        for year in range(2003, 2020):
            print(f"Extracting Year# {year}")
            r = req.get(
                f"https://lehighsports.com/sports/mens-soccer/schedule/{year}")
            if r.status_code == 200:
                soup = BeautifulSoup(r.text, 'html.parser')
                for date in soup.findAll("div", {'class': 'sidearm-schedule-game-opponent-date flex-item-1'}):
                    d.append(date.get_text(strip=True, separator=" "))
                for name in soup.findAll("div", {'class': 'sidearm-schedule-game-opponent-name'}):
                    n.append(name.get_text(strip=True))
                for result in soup.findAll("div", {'class': 'sidearm-schedule-game-result'}):
                    result = result.get_text(strip=True)
                    #result = result.get_text(strip=True).split(',')
                    res.append(result)
                if len(d) != len(res):
                    res.append("None")
                for opp in soup.findAll("div", {'class': 'sidearm-schedule-game-opponent-text'}):
                    op.append(opp.get_text(strip=True, separator=' '))
                    yr.append(year)


    data = []
    for items in zip_longest(yr, d, n, op, res):
        data.append(items)

    df = pd.DataFrame(data, columns=['Year', 'Date', 'Name', 'opponent', 'Result']).to_excel('lehigh.xlsx', index=False)

1 Ответ

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

Я собираюсь сосредоточиться здесь только на разбиении списка res на три столбца, и вы можете включить его в свой код по своему усмотрению. Допустим, у вас есть это:

res1='T, 0-0(2 OT)'
res2='W,2-1OT' 
res3='T,2-2Game called '
res4='W,2-0'
scores = [res1,res2,res3,res4]

Мы разбили их следующим образом:

print("result","score","extra")
for score in scores:
    n_str = score.split(',')
    target = n_str[1].strip()        
    print(n_str[0].strip(),'    ',target[:3],' ',target[3:])

Вывод:

result score extra
T      0-0   (2 OT)
W      2-1   OT
T      2-2   Game called
W      2-0   

Обратите внимание, что это предполагает, что ни одна игра не заканчивается с двойными цифрами (скажем, 11-2 или что-то еще); так что это должно работать для вашей типичной футбольной игры, но не удастся с баскетболом: D

...