0

@martineau 我更新了我的代码,这是你的意思吗?我如何处理 KeyError 而不是 NameError ?

url = "http://app2.nea.gov.sg/anti-pollution-radiation-protection/air-pollution/psi/psi-readings-over-the-last-24-hours"
web_soup = soup(urllib2.urlopen(url))

table = web_soup.find(name="div", attrs={'class': 'c1'}).find_all(name="div")[4].find_all('table')[0]

data = {}
cur_time = datetime.datetime.strptime("12AM", "%I%p")
for tr_index, tr in enumerate(table.find_all('tr')):
    if 'Time' in tr.text:
        continue
    for td_index, td in enumerate(tr.find_all('td')):
        if not td_index:
            continue
        data[cur_time] = td.text.strip()

        if td.find('strong'):
            bold_time = cur_time
            data[bold_time] = '20'
        cur_time += datetime.timedelta(hours=1)

        default_value = '20' # whatever you want it to be

    try:
        bold = data[bold_time]
    except NameError:

        bold_time = beforebold = beforebeforebold = default_value
    # might want to set "bold" to something, too, if needed
    else:   
        beforebold = data.get(bold_time - datetime.timedelta(hours=1)) 
        beforebeforebold =  data.get(bold_time - datetime.timedelta(hours=2))

这是我打印数据以进行计算的地方。

print bold
print beforebold
print beforebeforebold
4

2 回答 2

1

你需要添加一些东西来设置data[bold_time]

    if td.find('strong'):
        bold_time = cur_time
        data[bold_time] = ????? # whatever it should be
    cur_time += datetime.timedelta(hours=1)

只要找到该单词,这应该避免 theNameError和exceptions 。您仍然可能想要防御性地编码并优雅地处理其中一个或两个。那应该做什么异常,处理那些不应该发生的异常情况......KeyErrorstrong

于 2013-07-06T18:17:01.460 回答
0

在它消失之前我已经阅读了你的上一篇文章,然后我读了这篇文章。
我觉得很遗憾使用 BeautifulSoup 来实现你的目标,因为从我看到的代码中,我发现它的使用很复杂,而且正则表达式的运行速度大约是 BeautifulSoup 的 10 倍。

这是只包含 的代码re,它提供了您感兴趣的数据。
我知道,有人会说 HTML 文本不能被正则表达式解析。我知道,我知道……但我不解析文本,我直接找到有趣的文本块。这个网站的网页源代码显然结构非常好,似乎几乎没有错误的风险。此外,可以添加测试和验证以密切关注源代码并立即通知网站管理员在网页中所做的可能更改

import re
from httplib import HTTPConnection

hypr = HTTPConnection(host='app2.nea.gov.sg',
                      timeout = 300)
rekete = ('/anti-pollution-radiation-protection/'
          'air-pollution/psi/'
          'psi-readings-over-the-last-24-hours')

hypr.request('GET',rekete)
page = hypr.getresponse().read()


patime = ('PSI Readings.+?'
          'width="\d+%" align="center">\r\n'
          ' *<strong>Time</strong>\r\n'
          ' *</td>\r\n'
          '((?: *<td width="\d+%" align="center">'
          '<strong>\d+AM</strong>\r\n'
          ' *</td>\r\n)+.+?)'

          'width="\d+%" align="center">\r\n'
          ' *<strong>Time</strong>\r\n'
          ' *</td>\r\n'
          '((?: *<td width="\d+%" align="center">'
          '<strong>\d+PM</strong>\r\n'
          ' *</td>\r\n)+.+?)'
          'PM2.5 Concentration')
rgxtime = re.compile(patime,re.DOTALL)


patline = ('<td align="center">\r\n'
           ' *<strong>'             # next line = group 1
           '(North|South|East|West|Central|Overall Singapore)'
           '</strong>\r\n'
           ' *</td>\r\n'
           '((?: *<td align="center">\r\n'  # group 2 start
           ' *[.\d-]+\r\n'                  #
           ' *</td>\r\n)*)'                 # group 2 end

           ' *<td align="center">\r\n'
           ' *<strong style[^>]+>'
           '([.\d-]+)' # group 3
           '</strong>\r\n'
           ' *</td>\r\n')
rgxline = re.compile(patline)

rgxnb = re.compile('<td align="center">\r\n'
                   ' *([.\d-]+)\r\n'
                   ' *</td>\r\n')


m= rgxtime.search(page)

a,b = m.span(1) # m.group(1) contains the data AM
d = dict((mat.group(1),
          rgxnb.findall(mat.group(2))+[mat.group(3)])
         for mat in rgxline.finditer(page[a:b]))

a,b = m.span(2) # m.group(2) contains the data PM
for mat in rgxline.finditer(page[a:b]):
    d[mat.group(1)].extend(rgxnb.findall(mat.group(2))+[mat.group(3)])


print 'last 3 values'
for k,v in d.iteritems():
    print '%s  :  %s' % (k,v[-3:])
于 2013-07-06T23:47:14.330 回答