Python如何添加异常?

Python如何添加异常?,python,exception,exception-handling,Python,Exception,Exception Handling,@我已经更新了密码,这是你的意思吗?如何处理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

@我已经更新了密码,这是你的意思吗?如何处理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

您需要添加一些设置
数据[粗体时间]

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

只要找到单词
strong
,就可以避免
namererror
KeyError
异常。您可能仍然希望编写防御代码,并优雅地处理其中一个或两个。这就是例外的意义所在,处理那些不应该发生的例外情况…

在你之前的帖子消失之前,我已经读过了,然后我又读了这篇。
出于您的目标,我觉得使用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:])
重新导入
从httplib导入HTTPConnection
hypr=HTTPConnection(host='app2.nea.gov.sg',
超时=300)
雷克特=('/防污染辐射防护/'
“空气污染/psi/”
‘过去24小时内的psi读数’)
催促请求('GET',rekete)
page=hypr.getresponse().read()
帕蒂姆=('PSI读数+?'
'width=“\d+%”align=“center”>\r\n'
'*时间\r\n'
“*\r\n”
'((?: *'
“\d+AM\r\n”
“*\r\n)+.+?)”
'width=“\d+%”align=“center”>\r\n'
'*时间\r\n'
“*\r\n”
'((?: *'
“\d+PM\r\n”
“*\r\n)+.+?)”
‘PM2.5浓度’)
rgxtime=re.compile(patime,re.DOTALL)
patline=('\r\n'
“*”#下一行=第1组
(北|南|东|西|中|新加坡全境)
“\r\n”
“*\r\n”
“((?:*\r\n”#第2组开始
'*[。\d-]+\r\n'#
“*\r\n)*”)#第2组结束
“*\r\n”
“*]+>”
“([.\d-]+)”#第3组
“\r\n”
“*\r\n”)
rgxline=re.compile(patline)
rgxnb=重新编译('\r\n'
“*([.\d-]+)\r\n”
“*\r\n”)
m=rgxtime.search(第页)
a、 b=m.span(1)#m.group(1)包含数据AM
d=dict(材料组(1),
rgxnb.findall(材料组(2))+[材料组(3)])
对于rgxline.finditer中的mat(第[a:b]页)
a、 b=m.span(2)#m.group(2)包含数据PM
对于rgxline.finditer中的mat(第[a:b]页):
扩展(rgxnb.findall(材料组(2))+[材料组(3)])
打印“最后3个值”
对于k,v在d.iteritems()中:
打印“%s:%s%”(k,v[-3:])

如果
bold=data[bold\U time]
语句引发了
NameError
,那么
bold
应该有什么值?bold=data[bold\U time]应该在网站中有strong这个词的值是,但是如果找不到单词strong,您希望将
bold
设置为什么?在这种情况下,它的默认值应该是什么?这需要知道在发生这种情况时将
beforebold
beforebforebold
设置为什么。在网站中,“strong”一词是肯定存在的,因此我想得到它的值,并替换为beforebold和beforebforebold。有什么想法吗?我已经删除了我的答案,因为你不知道你想在这里做什么。你的问题是“bold=data[bold\U time]名称错误:名称'bold\U time'”我有一个bold=data[bold\U time]键错误:50帮助,我设置了默认值='50'我有这个名称错误:名称'bold\U time'在我更改为除键错误后没有定义OK,我认为问题在于,当您发现word
strong
时,您从未设置
data[bold\u time]
,也从未设置
bold\u time
本身。在
if td.find('strong'):
后面添加一行,将其值也设置为一个值。我解决了它,这是因为缩进。哈哈,非常感谢!我真的很感谢你,谢谢你会看的,帮帮我,然后呢?