2017-01-15 8 views
0

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

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. Я не очень хорош в этом.

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

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() 

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

+2

Пожалуйста, отредактируйте ваше сообщение, чтобы исправить ваш отступ, чтобы действительно опубликованный код выполнялся. Кроме того, добавьте ** полный текст ** любых ошибок или трассировок. – MattDMo

+0

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

+0

Нет никаких ошибок, он просто ничего не поместит в файл .txt. Кроме того, мне очень жаль. Я действительно не понимаю, что я делаю. Это все для класса. –

ответ

0

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

  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() 

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

+0

Хорошо, пока ваш код работает Bilal Akil, так что спасибо! Извините, я настолько некомпетентен. Раньше я никогда раньше не использовал Python, и никаких предварительных требований не было. для класса для него, но я не думаю, что наш учитель понял, как сильно это будет. Я очень ценю вашу помощь! –

+0

тоже какой импорт кодеки делать? –

+0

'import codecs' необходим для решения третьей проблемы, о которой я говорил. Я использовал импортированный модуль 'codecs' 4 строки позже, чтобы изменить способ открытия файла:' codecs.open ('wunder-data.txt', 'w', 'utf-8') '. Он открывается тот же файл, что и раньше, но на этот раз в кодировке UTF-8. –

 Смежные вопросы

  • Нет связанных вопросов^_^