Выходной файл оставляет месяцы пустыми от данных о погоде

Я пытаюсь почистить данные с сайта погоды 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)
Другие вопросы по тегам