2017-01-15 28 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循环创建一个网址列表,并一次处理它们,只是一个建议。你的代码很杂乱...... – 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

'进口编解码器'是解决我提到的第三个问题所必需的。我在后面的4行中使用了导入的'codecs'模块来改变你打开文件的方式:'codecs.open('wunder-data.txt','w','utf-8')'。它与之前打开的文件相同,但是这次是UTF-8编码。 –

相关问题