Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 遍历URL_Python_Pandas_Web Scraping - Fatal编程技术网

Python 遍历URL

Python 遍历URL,python,pandas,web-scraping,Python,Pandas,Web Scraping,我试图通过迭代URL并将收集到的数据添加到列表中,从网站中获取数据。我知道它并不漂亮(非常新),但我对迭代之前的一切都相当满意: for date in date_list: # iterate through dates weather_list = pd.read_html(base_url + 'KOWD' + '/' + year + '/' + month + '/' + day + end_url) 我知道在for语句中,我必须调用year、month、day来遍历

我试图通过迭代URL并将收集到的数据添加到列表中,从网站中获取数据。我知道它并不漂亮(非常新),但我对迭代之前的一切都相当满意:

for date in date_list: # iterate through dates
        weather_list = pd.read_html(base_url + 'KOWD' + '/' + year + '/' + month + '/' + day + end_url)
我知道在for语句中,我必须调用year、month、day来遍历它们——但我认为通过在dataframe中声明它们,它们将被识别为列表。有人有什么建议吗?不能通过这个

import pandas as pd
import csv
from datetime import datetime

base_url = 'https://www.wunderground.com/history/airport/'
end_url = '/DailyHistory.html?req_city=&req_state=&req_statename=&reqdb.zip=&reqdb.magic=&reqdb.wmo='

start_date = '1970, 1, 1'
end_date = '1970, 1, 3'

daterange = pd.date_range(start_date, end_date)

date_list = []
for single_date in daterange: # create list of dates
    date_list.append(single_date.strftime("%Y-%m-%d"))

date_list = pd.DataFrame(date_list, columns = ['date'])

date_list['year'], date_list['month'], date_list['day'] = zip(*date_list['date'].map(lambda x: x.split('-'))) # split date into parts
year = date_list['year']
month = date_list['month']
day = date_list['day']
#print(year)
#print(month)
#print(day)
#print(type(date_list))        
#print(date_list)

for date in date_list: # iterate through dates
    weather_list = pd.read_html(base_url + 'KOWD' + '/' + year + '/' + month + '/' + day + end_url)
    #print(type(weather_list))
    weather_list = weather_list[4] # this is the table of values I want
    weather_list.append(date)

变量
属于
类型。您需要在循环它们时访问它们。考虑下面的代码。
for i in range(0,len(date_list)): # iterate through dates
    weather_list = pd.read_html(base_url + 'KOWD' + '/' + year[i] + '/' + month[i] + '/' + day[i] + end_url)
    #print(type(weather_list))
    weather_list = weather_list[4] # this is the table of values I want
    weather_list.append(date_list.iloc[i])

注意:运行此代码时,您提到的
索引器
已解决,但我在
weather\u list=weather\u list[4]
行中遇到错误。我检查过了,
len(天气列表)
总是4。显然,这是一个单独的问题,因为在这种情况下肯定会发生
列表索引超出范围的情况。

只需在
日期范围中迭代日期就更容易了:

daterange = pd.date_range(start_date, end_date)
url_template = base_url + 'KOWD/{d.year}/{d.month}/{d.day}' + end_url
for date in daterange:
    url = url_template.format(d=date)
    weather_list = pd.read_html(url)
    # etc.
如果这对您有效,那么您可以删除在数据框中存储日期的所有后续代码,将它们更改为字符串,并为年、月和日期创建单独的列

如果确实需要创建日期的数据框,可以执行以下操作:

date_list = pd.DataFrame(daterange, columns=['date'])
for k in ['year', 'month', 'day']:
    date_list[k] = date_list.apply(lambda r: getattr(r.date, k), axis=1)
weather_dict = {}
for date in daterange:
    table = pd.read_html(url, header=0)[2]
    table.set_index(table.columns.values[0], inplace=True)
    table.index.set_names(None, inplace=True)
    weather_dict[date] = table

weather_df = pd.concat(weather_dict)
然后可以迭代抛出这些行

for index, row in date_list.iterrows():
    url = url_template.format(d=row)
    weather_list = pd.read_html(url)
    # etc.

然后考虑您希望的代码格式>代码> WeeRythList输出。如果刮取的信息不适合包含在数据帧中,那么它作为

{date:table}
对的字典可能更有意义

编辑:例如,如果要从每页中选取第三个表,并将其与日期连接到单个数据框中,可以执行以下操作:

date_list = pd.DataFrame(daterange, columns=['date'])
for k in ['year', 'month', 'day']:
    date_list[k] = date_list.apply(lambda r: getattr(r.date, k), axis=1)
weather_dict = {}
for date in daterange:
    table = pd.read_html(url, header=0)[2]
    table.set_index(table.columns.values[0], inplace=True)
    table.index.set_names(None, inplace=True)
    weather_dict[date] = table

weather_df = pd.concat(weather_dict)

这里的问题是什么?我一个问题都没问,很好。。。哈我想知道如何将这三个值(年、月、日)传递到for循环中,以便在每个新URL上收集和附加数据。我在上面显示它的方式给了我一个错误“TypeError:无法读取类型为“Series”的对象”。但我怀疑还有什么地方做错了……哈夫,谢谢你的回复。我的想法是,pd.read\u html
返回一个列表,然后
weather\u list=weather\u list[4]
返回该列表中第四个表的数据帧。。。你能澄清一下这是否是我的正确理解吗?也许我不理解文档@DavidBlack,
pd.read\u html()
返回数据帧的列表。在yur情况下,返回的列表中总共有4个数据帧。如果需要第四个/最后一个数据帧。这将是天气列表[3]
,因为4个列表的索引为0到3。非常感谢Stuart!第一种方法有效,所以现在只需清理一点数据以供使用。我理解了数据类型:
weather\u list=pd.read\u html(url,header=0)weather\u list=weather\u list[4]
-pd.read\u html返回url处可用列表的索引列表,weather\u list[4]获取索引4表并将其放入数据帧?
pd。read\u html
根据页面中找到的表返回数据帧列表,而
weather\u list[4]
将是这些数据帧中的第五个。(但正如在另一篇文章中所指出的,这一页上只有4个表格。)