Как получить read_ html до l oop? Python - PullRequest
0 голосов
/ 29 апреля 2020

В настоящее время у меня есть следующий код, df2 = df [0] ограничивает код сбором данных только для 1 игры в эту соответствующую дату. Я пытаюсь выяснить, как собрать данные о нескольких играх, которые произошли в один и тот же день.

Идея состоит в том, чтобы извлечь данные о матчах для всех игр за один день и продолжить работу для всей страницы

Например, таблицы [20] возвращаются на html ссылки

1) href = "/ matchs / 2338970 / north-vs-mad-lions-dreamhack-open-leipzig-2020

2) href = "/ matchs / 2338968 / heroi c -vs-mad-lions-dreamhack-open-leipzig-2020

Я пробовал следующее:

for i in range(len(df2)):
  df2[i] = df2[i]

, но он не обновляет каждую переменную (teamchosen, select, maps), а просто повторяет данные первых совпадений для других совпадений (см. рисунок) enter image description here

team_id = 8362
for i in range(0,1):
    i = i*100
    url = "https://www.hltv.org/results?offset={}&team={}".format(i,team_id)

    res = requests.get(url)
    soup = bs(res.content, 'lxml')

    tables = soup.find_all("div", {"class": "results-sublist"})


    index = 0
    list_dfs = []
    for table in tables:
        df = pd.DataFrame(columns=["match", "teamchoose", "chosen", "maps", "team", "opponent", "date"])
        df2 = pd.read_html(str(table))

        df2 = df2[0]

        link = table.find('a', href=True)
        link = "https://www.hltv.org/" + link.get('href')
        res = requests.get(link)
        soup = bs(res.content, 'lxml')
        temp = soup.find_all("div", {"class": "padding"})
        date = date = pd.to_datetime(int(soup.select(".timeAndEvent div")[0]['data-unix'])*1000000)

        out = re.findall(r'<div>\d\.(.*?)</div>', str(temp))

        dict_choices = {"teamchoose": [], "chosen": [], "maps": []}
        for choice in out[0:6]:
            split = choice.strip(" ").split(" ")
            dict_choices["teamchoose"].append(" ".join(split[:-2]))
            dict_choices["chosen"].append(split[-2])
            dict_choices["maps"].append(split[-1])
                # df = df.append(dict_choices, True)
                # dict_choices = {"turn": [], "choice": [], "maps": []}
        try:
            left = out[6]
            split = left.strip(" ").split(" ")
            dict_choices["teamchoose"].append(split[2])
            dict_choices["chosen"].append(split[2])
            dict_choices["maps"].append(split[0])
        except:
            pass
        df = df.append(pd.DataFrame.from_dict(dict_choices, orient='index').transpose())

        df["opponent"] = df2[2].iloc[0]
        df["team"] = df2[0].iloc[0]
        df["match"] = index
        df['date'] = date
        list_dfs.append(df)
        index +=1


df_out = pd.concat(list_dfs)
df_out = df_out[['match','date','team','opponent','teamchoose','chosen','maps']]
df_out.to_csv("{}_vetoes.csv".format(team_name),index=False)
print(tabulate(df_out, headers='keys', tablefmt='psql'))

1 Ответ

0 голосов
/ 29 апреля 2020

ок. Так что вам просто нужно провести l oop через вложенные таблицы, которые он извлекает из таблиц. Кроме того, я сделал еще одно изменение. Вместо того, чтобы устанавливать index = 0, а затем увеличивать после каждого l oop, вы можете использовать enumerate(), который сделает это за вас. Посмотрите, работает ли это:

import requests
import pandas as pd
from bs4 import BeautifulSoup as bs
import re


headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
team_id = 8362
for i in range(0,1):
    i = i*100
    url = "https://www.hltv.org/results?offset={}&team={}".format(i,team_id)

    res = requests.get(url, headers=headers)
    soup = bs(res.content, 'html.parser')

    tables = soup.find_all("div", {"class": "results-sublist"})



    list_dfs = []
    for index, table in enumerate(tables):
        print ('Page %s:\t%s of %s' %(i+1, index+1, len(tables)))
        dfs = pd.read_html(str(table)) #<--- returns all the tables into a list called dfs
        for tableIdx, df2 in enumerate(dfs):  #<---- add additional loop here
            df = pd.DataFrame(columns=["match", "teamchoose", "chosen", "maps", "team", "opponent", "date"])
            link = table.find_all('a', href=True)[tableIdx]   #<--- Also need to grab correct link for associated table/match if there are more than 1 match
            link = "https://www.hltv.org/" + link.get('href')
            res = requests.get(link, headers=headers)
            soup = bs(res.content, 'lxml')
            temp = soup.find_all("div", {"class": "padding"})
            date = pd.to_datetime(int(soup.select(".timeAndEvent div")[0]['data-unix'])*1000000)

            out = re.findall(r'<div>\d\.(.*?)</div>', str(temp))

            dict_choices = {"teamchoose": [], "chosen": [], "maps": []}
            for choice in out[0:6]:
                split = choice.strip(" ").split(" ")
                dict_choices["teamchoose"].append(" ".join(split[:-2]))
                dict_choices["chosen"].append(split[-2])
                dict_choices["maps"].append(split[-1])
                    # df = df.append(dict_choices, True)
                    # dict_choices = {"turn": [], "choice": [], "maps": []}
            try:
                left = out[6]
                split = left.strip(" ").split(" ")
                dict_choices["teamchoose"].append(split[2])
                dict_choices["chosen"].append(split[2])
                dict_choices["maps"].append(split[0])
            except:
                pass
            df = df.append(pd.DataFrame.from_dict(dict_choices, orient='index').transpose())

            df["opponent"] = df2[2].iloc[0]
            df["team"] = df2[0].iloc[0]
            df["match"] = index
            df['date'] = date
            list_dfs.append(df)



df_out = pd.concat(list_dfs)
df_out = df_out[['match','date','team','opponent','teamchoose','chosen','maps']]
df_out.to_csv("{}_vetoes.csv".format(team_name),index=False)
print(tabulate(df_out, headers='keys', tablefmt='psql'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...