Выходной файл оставляет месяцы пустыми от данных о погоде
Я пытаюсь почистить данные с сайта погоды wunderground.com. Я хочу, чтобы это было из Филадельфии каждый месяц (январь-декабрь) в течение 1941-2016 годов.
Сначала у меня был этот код, но он только скопировал и сделал файл для января 2016 года.
#!/usr/bin/python
#weather.scraper
from bs4 import BeautifulSoup
import urllib
import json
def main():
# weatherData = weather_philadelphia_data #Json beginns here
# with open(jsonfile, 'w') as outputFile:
# json.dump(weatherData, outputFile)
# #scrapping beginns here
r = urllib.urlopen("https://www.wunderground.com/history/airport/KPHL/2016/1/1/MonthlyHistory.html?&reqdb.zip=&reqdb.magic=&reqdb.wmo=&MR=1").read()
soup = BeautifulSoup(r, "html.parser")
tables = soup.find_all("table", class_="responsive airport-history-summary-table")
weatherdata = []
for table in tables: #reason for it to do it 12x
for tr in table.find_all("tr"):
firstTd = tr.find("td")
if firstTd and firstTd.has_attr("class") and "indent" in firstTd['class']:
values = {}
tds = tr.find_all("td")
maxVal = tds[1].find("span", class_="wx-value")
avgVal = tds[2].find("span", class_="wx-value")
minVal = tds[3].find("span", class_="wx-value")
if maxVal:
values['max'] = maxVal.text
if avgVal:
values['avg'] = avgVal.text
if minVal:
values['min'] = minVal.text
if len(tds) > 4:
sumVal = tds[4].find("span", class_="wx-value")
if sumVal:
values['sum'] = sumVal.text
scrapedData = {}
scrapedData[firstTd.text] = values
weatherdata.append(scrapedData)
break
with open ("january_2016.json", 'w' ) as outFile:
json.dump(weatherdata, outFile, indent=2)
print "done"
if __name__ == "__main__":
main()
Я пытался сделать цикл for, который проходит через все годы и месяцы. Это делает файл, но он пуст с данными, он показывает только годы. Это новый код:
#!/usr/bin/python
#weather.scraper
from bs4 import BeautifulSoup
import urllib
import json
allData = []
# this loops through all the Weather years
for y in range(1941, 2017):
yearData = {}
yearData['year'] = y
months = []
for m in range(1, 13):
def main():
# weatherData = weather_philadelphia_data #Json beginns here
# with open(jsonfile, 'w') as outputFile:
# json.dump(weatherData, outputFile)
# scrapping beginns here
url = "https://www.wunderground.com/history/airport/KPHL/%d/%d/1/MonthlyHistory.html" % (y, m)
r = urllib.urlopen(url).read()
soup = BeautifulSoup(r, "html.parser")
tables = soup.find_all("table", class_="responsive airport-history-summary-table")
weatherPerMonth = {}
weatherdata = []
for table in tables: #reason for it to do it 12x
for tr in table.find_all("tr"):
firstTd = tr.find("td")
if firstTd and firstTd.has_attr("class") and "indent" in firstTd['class']:
values = {}
tds = tr.find_all("td")
maxVal = tds[1].find("span", class_="wx-value")
avgVal = tds[2].find("span", class_="wx-value")
minVal = tds[3].find("span", class_="wx-value")
if maxVal:
values['max'] = maxVal.text
if avgVal:
values['avg'] = avgVal.text
if minVal:
values['min'] = minVal.text
if len(tds) > 4:
sumVal = tds[4].find("span", class_="wx-value")
if sumVal:
values['sum'] = sumVal.text
scrapedData = {}
scrapedData[firstTd.text] = values
weatherdata.append(scrapedData)
break
monthData = {}
monthData['month'] = m
monthData['weather'] = weatherPerMonth
months.append(monthData)
yearData['months'] = months
allData.append(yearData)
with open ("allData_philly.json", 'w' ) as outFile:
json.dump(allData, outFile, indent=2)
print "done"
if __name__ == "__main__":
main()
Это часть выходного файла, который он создает.
[
{
"months": [],
"year": 1941
},
]
Это как до 2016 года.
Проблема в следующем. Я хочу файл, который дает мне данные о погоде за 12 месяцев (январь-декабрь) за 1941-2016 годы, и это должно выглядеть примерно так:
[
{
"months": [{
'month': 12
'weather' : {
"Max Temperature": {
"max": "18",
"avg": "6",
"min": "-2"
}
},
{
"Mean Temperature": {
"max": "12",
"avg": "1",
"min": "-6"
}
},
{
"Min Temperature": {
"max": "6",
"avg": "-3",
"min": "-11"
}
}],
"year": 1941
},
]
Но я не могу понять, почему мой код не работает, я надеюсь, что кто-то может помочь!
1 ответ
Ваш код выглядит хорошо, есть только пара небольших вещей, которые мешают вам получить правильный вывод.
def main():
находится внутри цикла, поэтому при вызовеmain()
это не проходит через все годы. Это выглядит хорошо в вашем первом примере.- ты заявляешь
weatherPerMonth
как пустой список, а затем назначить егоmonthData['weather']
, Ваши фактические данные находятся вweatherdata
но это никогда нигде не пишется. - Приведенный ниже код является лишь незначительной модификацией вашего кода, несколькими перестановками и изменениями отступов, но он должен дать вам желаемый результат.
#weather.scraper
from bs4 import BeautifulSoup
import urllib.request
import json
allData = []
# this loops through all the Weather years
for y in range(2012, 2014):
yearData = {}
yearData['year'] = y
months = []
for m in range(1, 13):
# weatherData = weather_philadelphia_data #Json beginns here
# with open(jsonfile, 'w') as outputFile:
# json.dump(weatherData, outputFile)
# scrapping beginns here
url = "https://www.wunderground.com/history/airport/KPHL/%d/%d/1/MonthlyHistory.html" % (y, m)
r = urllib.request.urlopen(url).read()
soup = BeautifulSoup(r, "html.parser")
tables = soup.find_all("table", class_="responsive airport-history-summary-table")
weatherPerMonth = {}
weatherdata = []
monthData = {}
for table in tables: #reason for it to do it 12x
for tr in table.find_all("tr"):
firstTd = tr.find("td")
if firstTd and firstTd.has_attr("class") and "indent" in firstTd['class']:
values = {}
tds = tr.find_all("td")
maxVal = tds[1].find("span", class_="wx-value")
avgVal = tds[2].find("span", class_="wx-value")
minVal = tds[3].find("span", class_="wx-value")
if maxVal:
values['max'] = maxVal.text
if avgVal:
values['avg'] = avgVal.text
if minVal:
values['min'] = minVal.text
if len(tds) > 4:
sumVal = tds[4].find("span", class_="wx-value")
if sumVal:
values['sum'] = sumVal.text
scrapedData = {}
scrapedData[firstTd.text] = values
weatherdata.append(scrapedData)
monthData['month'] = m
monthData['weather'] = values
break
months.append(monthData)
yearData['months'] = months
allData.append(yearData)
with open ("allData_philly.json", 'w' ) as outFile:
json.dump(allData, outFile, indent=2)