【问题标题】:Python how to add exception?Python如何添加异常?
【发布时间】:2013-07-06 17:45:40
【问题描述】:

@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

【问题讨论】:

  • 如果bold = data[bold_time] 语句引发NameErrorbold 应该有什么值?
  • bold = data[bold_time] 应该有网站app2.nea.gov.sg/anti-pollution-radiation-protection/…中strong这个词的值@
  • 是的,但是如果没有找到 strong 一词,您希望将 bold 设置为什么 - 在这种情况下它的默认值应该是什么?这需要知道在发生这种情况时将beforeboldbeforebeforebold 设置为什么。
  • “强”这个词在网站上肯定有,因此我想获得它的价值并替换为 beforebold 和 beforebeforebold。有什么想法吗?
  • 我已经删除了我的答案,因为你不知道你想在这里做什么。

标签: python exception exception-handling


【解决方案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)

只要找到单词strong,这应该避免NameErrorKeyError 异常。您仍然可能希望进行防御性编码并优雅地处理其中一个或两个。那该做什么异常,处理那些不应该发生的异常情况……

【讨论】:

  • 你的问题是“bold = data[bold_time] NameError: name 'bold_time'”
  • 我有一个粗体 = data[bold_time] KeyError: 50 help, i set the default_value = '50'
  • 我有这个 NameError: name 'bold_time' is not defined after I change to except KeyError
  • 好的,我认为问题是当您找到单词strong 时,您从未设置data[bold_time] 以及bold_time 本身。在if td.find('strong'): 之后添加一行,也将其值设置为一个值。
  • 我解决了,是因为缩进。哈哈 非常非常感谢!我真的很感谢你=)
【解决方案2】:

我在你之前的帖子消失之前读过它,然后我又读了这篇。
我觉得很遗憾使用 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:])

【讨论】:

  • 谢谢你会看=)
  • @Help me 然后,什么?
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 2018-02-11
  • 2014-06-10
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
相关资源
最近更新 更多