使用 Wunderground 数据进行网页抓取,BeautifulSoup
Web Scraping with Wunderground data, BeautifulSoup
好吧,我无计可施了。对于我的 class,我们应该从 wunderground.com 网站抓取数据。我们保持 运行ning 问题(错误消息),或者代码将 运行 正常,但 .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()
所以我很不确定。我想做的是抓取
的数据
我在尝试执行您的代码时遇到了以下错误(并在下面修复了这些错误):
- 嵌套循环的缩进无效。
- 缺少导入(顶部的行),但也许您只是将它们从粘贴中排除了。
- 正在尝试将 "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()
正如对您问题的评论所建议的那样,这里还有其他需要改进的地方我没有触及 - 我只是试图让您发布的代码执行。
好吧,我无计可施了。对于我的 class,我们应该从 wunderground.com 网站抓取数据。我们保持 运行ning 问题(错误消息),或者代码将 运行 正常,但 .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()
所以我很不确定。我想做的是抓取
的数据我在尝试执行您的代码时遇到了以下错误(并在下面修复了这些错误):
- 嵌套循环的缩进无效。
- 缺少导入(顶部的行),但也许您只是将它们从粘贴中排除了。
- 正在尝试将 "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()
正如对您问题的评论所建议的那样,这里还有其他需要改进的地方我没有触及 - 我只是试图让您发布的代码执行。