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 ответ
Я столкнулся со следующими ошибками (и исправил их ниже) при попытке выполнить ваш код:
- Отступ вложенных циклов был недействительным.
- Отсутствует импорт (строки вверху), но, возможно, вы просто исключили их из своей пасты.
- Попытка записать строки в кодировке utf-8 в файл ascii. Чтобы исправить это, я использовал
codecs
модуль для открытия файлаf
как "utf-8". - Файл был закрыт внутри цикла, это означает, что после первой записи в него он будет закрыт, а затем при следующей записи произойдет сбой (поскольку он был закрыт). Я переместил строку, чтобы закрыть файл снаружи петель.
Теперь, насколько я могу судить (без того, чтобы вы сказали нам, что вы на самом деле хотите, чтобы этот код делал), он работает? По крайней мере, без ошибок сразу выскакивают...
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()
Как уже отмечалось в комментариях к вашему вопросу, здесь есть и другие области для улучшения, которые я не затронул - я просто попытался выполнить исполняемый вами код.