Создайте цикл, повторяя строку в коде - PullRequest
0 голосов
/ 10 июня 2018

У меня есть следующий код:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
import requests 

from requests import get

date = []
tourney_round = []
result = []
winner_odds = []
loser_odds = []
surface = []
players_and_tourney

response = get('http://www.tennisexplorer.com/player/humbert-e2553/?annual=all')

page_html = BeautifulSoup(response.text, 'html.parser')

results2018_containers = page_html.find_all('div', id = 'matches-2018-1-data')

for container in results2018_containers:
played_date_2018 = results2018_containers[0].findAll('td', class_ = 'first time')
for i in played_date_2018:
            date.append(i.text)

string_2018 = '2018'
date = [x + string_2018 for x in date]

for container in results2018_containers:
rounds_2018 = results2018_containers[0].findAll('td', class_ = 'round')
for i in rounds_2018:
            tourney_round.append(i.text)

for container in results2018_containers:
results_2018 = results2018_containers[0].findAll('td', class_ = 'tl')
for i in results_2018:
            result.append(i.text)

for container in results2018_containers:
surfaces_2018 = results2018_containers[0].findAll('td', class_ = 's-color')
for i in surfaces_2018:
            surface.append(i.find('span')['title'])

for container in results2018_containers:
odds_2018 = results2018_containers[0].findAll('td', class_ = 'course')

winner_odds_2018 = odds_2018[0:][::2]
for i in winner_odds_2018:
    winner_odds.append(i.text)

loser_odds_2018 = odds_2018[1:][::2]
for i in loser_odds_2018:
    loser_odds.append(i.text)

for container in results2018_containers:
namesandtourney_2018 = results2018_containers[0].findAll('td', class_ = 't-name')
for i in namesandtourney_2018:
            players_and_tourney.append(i.text)

from itertools import chain, groupby, repeat

chainer = chain.from_iterable

def condition(x):
return x.startswith('\xa0')

elements = [list(j) for i, j in groupby(players_and_tourney, key=condition) if not i]

# create list of headers
headers = [next(j) for i, j in groupby(players_and_tourney, key=condition) if i]

# chain list of lists, and use repeat for headers
initial_df_2018 = pd.DataFrame({'Date': date,
                'Surface': surface,
                'Players': list(chainer(elements)),
                'Tournament': list(chainer(repeat(i, j) for i, j in \
                         zip(headers, map(len, elements)))),
                'Round': tourney_round,
                'Result': result,
                'Winner Odds': winner_odds,
                'Loser Odds' : loser_odds})

initial_df_2018['Winner'], initial_df_2018['Loser'] = 
initial_df_2018['Players'].str.split(' - ', 1).str
del initial_df_2018['Players']

initial_df_2018 = initial_df_2018[['Date','Surface','Tournament','Winner','Loser','Result','Winner Odds','Loser Odds']]

Я хочу создать цикл, который запускает код для каждого года, начиная с 2005 года. Таким образом, в основном, выполнение цикла путем замены 2018 по всему коду на каждый годмежду 2005 и 2018 годами. Если возможно, код будет выполняться сначала для 2018 года, затем для 2017 года и т. д. до 2005 года.

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

Ответы [ 4 ]

0 голосов
/ 10 июня 2018

Вы можете сохранить год как целое число, но все равно использовать его в строке.

for year in range(2018, 2004, -1):
    print(f"Happy New Year {year}")

Другими способами включения числа в строку являются "Happy New Year {}".format(year) или "it is now " + str(year) + " more text".

Кроме того, я не думаю, что вы это делаете, но если кто-то найдет это и действительно захочет «перебрать строку» Цезарные шифры - это хорошее место для поиска.

0 голосов
/ 10 июня 2018

Это не проблема зацикливания, но вам нужно определить, как вы хотите, чтобы ваши результаты.Я использовал здесь словарь и превратил ваш код в функцию, которую я могу вызывать с переменными:

def get_data(year):
    date =[]

    response = get('http://www.example.com')

    page_html = BeautifulSoup(response.text, 'html.parser')

    results_containers = page_html.find_all('div', id = 'played-{year}-data'.format(year))

    for container in results_containers:
        played_date = results_containers[0].findAll('td', class_ = 'plays')
        for i in played_date:
            date.append(i.text)

    return date

Теперь все, что мне нужно сделать, - это создать range возможных лет и вызватьработать каждый раз, это можно сделать так:

all_data = {year: get_data(year) for year in range(2018, 2004, -1)}
0 голосов
/ 10 июня 2018

Просто используйте петлю for над range.Что-то вроде:

date =[]

response = get('http://www.example.com')

page_html = BeautifulSoup(response.text, 'html.parser')

for year in range(2018, 2004, -1):
   year_id = 'played-{}-data'.format(year)
   results_containers = page_html.find_all('div', id=year_id)

   ...
0 голосов
/ 10 июня 2018

Если я вас правильно понял, вы хотите выполнить запрос на 2018 год на все годы между 2005-2018.

То, что я делал, было циклически просматривал ваш код в течение многих лет в этих диапазонах, каждый раз заменяя идентификатор и добавляя все данные в список.

response = get('http://www.example.com')

page_html = BeautifulSoup(response.text, 'html.parser')
date_dict = {}

for year in range(2019, 1, -1):
    date = []
    string_id = "played-{}-data".format(year)
    results_containers = page_html.find_all('div', id = string_id)

    if (results_containers == None):
        continue
    for container in results_containers :
        played_date = results_containers [0].findAll('td', class_ = 'plays')
        for i in played_date :
            date.append(i.text)
    if not (year in date_dict):
        date_dict[year] = []
    date_dict[year] += date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...