Web Scraping с данными Wunderground, BeautifulSoup

Хорошо, я в конце остроумие здесь. Для моего класса мы должны собрать данные с сайта wunderground.com. Мы продолжаем сталкиваться с проблемами (сообщениями об ошибках), ИЛИ код будет работать нормально, но файл.txt не будет содержать данных. Это довольно раздражает, потому что мне нужно это сделать! так вот мой код.

f = open('wunder-data1.txt', 'w')
for m in range(1, 13):
for d in range(1, 32):
    if (m == 2 and d > 28):
        break
    elif (m in [4, 6, 9, 11] and d > 30):
        break
    url = "http://www.wunderground.com/history/airport/KBUF/2009/" + str(m) + "/" + str(d) + "/DailyHistory.html"
    page = urllib2.urlopen(url)
    soup = BeautifulSoup(page, "html.parser")
    dayTemp = soup.find("span", text="Mean Temperature").parent.find_next_sibling("td").get_text(strip=True)
    if len(str(m)) < 2:
        mStamp = '0' + str(m)
    else:
        mStamp = str(m)
    if len(str(d)) < 2:
        dStamp = '0' +str(d)
    else:
        dStamp = str(d)
    timestamp = '2009' + mStamp +dStamp
    f.write(timestamp.encode('utf-8') + ',' + dayTemp + '\n')
    f.close()

Также извините, этот код, вероятно, не является правильным отступом, как в Python. Я не очень хорош в этом.

ОБНОВЛЕНИЕ: Таким образом, кто-то ответил на вопрос ниже, и это сработало, но я понял, что извлекаю неправильные данные (упс). Итак, я вставил в это:

    import codecs
    import urllib2
    from bs4 import BeautifulSoup

    f = codecs.open('wunder-data2.txt', 'w', 'utf-8')

    for m in range(1, 13):
        for d in range(1, 32):
            if (m == 2 and d > 28):
                break
            elif (m in [4, 6, 9, 11] and d > 30):
                break

            url = "http://www.wunderground.com/history/airport/KBUF/2009/" + str(m) + "/" + str(d) + "/DailyHistory.html"
            page = urllib2.urlopen(url)
            soup = BeautifulSoup(page, "html.parser")

            dayTemp = soup.findAll(attrs={"class":"wx-value"})[5].span.string
            if len(str(m)) < 2:
                mStamp = '0' + str(m)
            else:
                mStamp = str(m)
            if len(str(d)) < 2:
                dStamp = '0' +str(d)
            else:
                dStamp = str(d)

            timestamp = '2009' + mStamp +dStamp

            f.write(timestamp.encode('utf-8') + ',' + dayTemp + '\n')

    f.close()

Так что я не совсем уверен. То, что я пытаюсь сделать, это очистить данные

1 ответ

Решение

Я столкнулся со следующими ошибками (и исправил их ниже) при попытке выполнить ваш код:

  1. Отступ вложенных циклов был недействительным.
  2. Отсутствует импорт (строки вверху), но, возможно, вы просто исключили их из своей пасты.
  3. Попытка записать строки в кодировке utf-8 в файл ascii. Чтобы исправить это, я использовал codecs модуль для открытия файла f как "utf-8".
  4. Файл был закрыт внутри цикла, это означает, что после первой записи в него он будет закрыт, а затем при следующей записи произойдет сбой (поскольку он был закрыт). Я переместил строку, чтобы закрыть файл снаружи петель.

Теперь, насколько я могу судить (без того, чтобы вы сказали нам, что вы на самом деле хотите, чтобы этот код делал), он работает? По крайней мере, без ошибок сразу выскакивают...

import codecs
import urllib2
from bs4 import BeautifulSoup

f = codecs.open('wunder-data1.txt', 'w', 'utf-8')

for m in range(1, 13):
    for d in range(1, 32):
        if (m == 2 and d > 28):
            break
        elif (m in [4, 6, 9, 11] and d > 30):
            break

        url = "http://www.wunderground.com/history/airport/KBUF/2009/" + str(m) + "/" + str(d) + "/DailyHistory.html"
        page = urllib2.urlopen(url)
        soup = BeautifulSoup(page, "html.parser")

        dayTemp = soup.find("span", text="Mean Temperature").parent.find_next_sibling("td").get_text(strip=True)

        if len(str(m)) < 2:
            mStamp = '0' + str(m)
        else:
            mStamp = str(m)
        if len(str(d)) < 2:
            dStamp = '0' +str(d)
        else:
            dStamp = str(d)

        timestamp = '2009' + mStamp +dStamp

        f.write(timestamp.encode('utf-8') + ',' + dayTemp + '\n')

f.close()

Как уже отмечалось в комментариях к вашему вопросу, здесь есть и другие области для улучшения, которые я не затронул - я просто попытался выполнить исполняемый вами код.

Другие вопросы по тегам