【问题标题】:Double for loop to extract data from several urls双 for 循环从多个 url 中提取数据
【发布时间】:2020-05-28 18:01:59
【问题描述】:

我正在尝试从网站获取数据以将它们写入要处理的 excel 文件。我有一个主要的 url 方案,我必须相应地更改“年份”和“参考编号”:

http://calcio-seriea.net/presenze/"年份"/"参考号"/

我已经尝试编写部分代码,但我遇到了一个问题。首先,我应该保持年份不变,而参考数取18区间的每一个数字。然后年份增加1,参考数字又取18区间的每一个数字。我试着给一个示例:

Y = 1998 RN = [1142:1159];
Y = 1999 RN = [1160:1177];
Y = 2000 RN = [1178:1195];
Y = … RN = …

那么从 2004 年开始,间隔变为 20,所以

Y = 2004 RN = [1250:1269];
Y = 2005 RN = [1270:1289];

截至年 = 包括 2019 年。

这是我目前能做的代码:

import pandas as pd

year = str(1998)

all_items = []

for i in range(1142, 1159):
    pattern = "http://calcio-seriea.net/presenze/" + year + "/" + str(i) + "/"

    df = pd.read_html(pattern)[6]

    all_items.append(df)

pd.DataFrame(all_items).to_csv(r"C:\Users\glcve\Desktop\data.csv", index = False, header = False)

print("Done!")

提前感谢大家

【问题讨论】:

  • 这应该是两个独立且非常具体的问题。第一个应该只是关于字符串格式,第二个是如何正确地将检索到的数据输入到DataFrame中。
  • 哦,好的。我认为在两个不同的主题中提出两个问题是垃圾邮件。那我就换
  • 你应该一次问一个问题,这样你就可以对cmet中的问题进行反馈或更专注地回答。
  • 在写入 csv 之前,您只需pd.concat(all_items)。
  • HampusLarsson 我编辑了问题 Datanovice 谢谢我已经检查过了,它有效!在我这边真的很愚蠢的问题啊啊啊

标签: python pandas web-scraping


【解决方案1】:

您的函数中缺少的只是pd.concat,但是当您一遍又一遍地调用相同的方法时,让我们编写一个函数,这样您就可以保持代码干爽。

def create_html_df(base_url, year,range_nums = ()):
    """
    Returns a dataframe from a url/html table
    base_url : the url to target
    year : the target year.
    range_nums = the range of numbers i.e (1,50)

   """
    start, stop = range_nums
    url_pat = [f"{base_url}/{year}/{i}" for i in range(start,stop)]
    dfs = []
    for each_url in url_pat:
        df = pd.read_html(each_url)[6]
        dfs.append(df)

    return pd.concat(dfs)

final_df = create_html_df(base_url = "http://calcio-seriea.net/presenze/",
               year = 1998,
               range_nums = (1142, 1159))

【讨论】:

  • 感谢您的帮助!唯一的事情是我想将所有数据添加到同一个变量 all_items 上。这意味着来自 year = 1998 range num (1142, 1159) 的数据与 year = 1999 range num (1160, 1177) 等连接
  • 然后你可以在函数中添加一个外循环并在你的岁月中迭代,随意编辑和自己玩:) @Gianluca
  • 我尝试了这个解决方案,但我在 range_nums = (int(1142+18*(y-1998)), int(1142+18*( y-1998))))。如果您能看一眼,那将有很大帮助year = range(1998, 2004) final_dfs = [] for y in year: final_df = create_html_df(base_url = "http://calcio-seriea.net/presenze/", year = y, range_nums = (int(1142+18*(y-1998)), int(1142+18*(y-1998)))) final_dfs.append(final_df)
猜你喜欢
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
相关资源
最近更新 更多