Skip to main content
 首页 » 编程设计

python之通过在整个代码中迭代字符串来创建循环

2025年05月04日23sharpest

我有以下代码:

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 年数据的代码,但我想要一个循环来提取页面上所有年份的数据。

请您参考如下方法:

如果我没理解错的话,您想要完成 2018 年的请求,涵盖 2005 年至 2018 年之间的所有年份。

我所做的是在这些范围内循环你的代码多年,每次都替换 id 并将所有数据添加到列表中。

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