Nano Hash - криптовалюты, майнинг, программирование

Python, как добавить исключение?

@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, если оператор bold = data[bold_time] вызывает NameError? 06.07.2013
  • полужирный = данные[bold_time] должны иметь значение слова strong на веб-сайте app2.nea.gov.sg/anti-pollution-radiation-protection/ 06.07.2013
  • Да, но какое значение вы хотите установить для bold, если слово strong не найдено — каким должно быть значение по умолчанию в этом случае? Это необходимо, чтобы знать, что установить beforebold и beforebeforebold, когда это произойдет. 06.07.2013
  • Слово «сильный» обязательно присутствует на веб-сайте, поэтому я хотел получить его значение и заменить его на beforebold и beforebeforebold. Есть идеи ? 06.07.2013
  • Я удалил свой ответ, так как вы понятия не имеете, что вы пытаетесь здесь сделать. 06.07.2013
  • Если слово strong обязательно будет там, зачем вообще получать NameError из оператора bold = data[bold_time]? Как устанавливается data[bold_time]? 06.07.2013
  • Чтобы вместо этого обрабатывать KeyError, измените except NameError: на except KeyError:. Чтобы также обработать это, добавьте отдельное предложение except KeyError:. Чтобы обрабатывать их обоих одинаково, используйте один except NameError, KeyError:. 07.07.2013

Ответы:


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)

Это должно избежать исключений как NameError, так и KeyError, если найдено слово strong. Вы по-прежнему можете захотеть кодировать безопасно и изящно обрабатывать один или оба из них. То, что должно было делать исключение, обрабатывать те исключительные случаи, которые не должны происходить...

06.07.2013
  • В вашем вопросе написано жирный = данные[bold_time] NameError: name 'bold_time' 06.07.2013
  • У меня был жирный = data[bold_time] KeyError: 50 help, я установил default_value = '50' 06.07.2013
  • У меня была эта ошибка NameError: имя 'bold_time' не определено после того, как я перешел на исключением KeyError 06.07.2013
  • Хорошо, я думаю, проблема в том, что вы никогда не устанавливаете data[bold_time], а также само bold_time, когда находите слово strong. Добавьте строку после if td.find('strong'):, чтобы также установить значение. 06.07.2013
  • Я решил это, это из-за отступа. Ха-ха большое спасибо! Я вам очень благодарна =) 06.07.2013
  • Хорошо, добро пожаловать... Я не понимаю, как отступы могли быть проблемой - по крайней мере, в коде, показанном в вашем вопросе, - но я думаю, это нормально. 06.07.2013
  • У меня была эта ошибка сейчас, как я могу ее решить? жирный шрифт = данные[жирный_время] NameError: имя 'жирный_время' не определено. Я добавил то, что вы написали, но все равно получаю эту ошибку 07.07.2013
  • Когда я переименовываю KeyError в NameError, все работает нормально. Как мне снова решить KeyError, если это произойдет? можно добавить два исключения? 07.07.2013
  • Прямо сейчас у меня есть 20, нет, нет, когда я печатаю полужирным шрифтом, перед жирным шрифтом и перед жирным шрифтом. Помощь ! 07.07.2013
  • Ссылаясь на код в вашем обновленном вопросе: значения None для beforebold и beforebeforebold связаны с тем, что когда вы вызываете data.get(bold_time - datetime.timedelta(hours=1)) (или с hours=2), он возвращает None, потому что в словаре data нет ключа со значением bold_time - datetime.timedelta(hours=1) (или hours=2). 07.07.2013

  • 2

    Я прочитал ваш предыдущий пост до того, как он исчез, а затем я прочитал этот.
    Мне жаль использовать BeautifulSoup для вашей цели, потому что, судя по коду, я нахожу его использование сложным, а дело в том, что регулярные выражения работают примерно в 10 раз быстрее, чем BeautifulSoup.

    Вот код, содержащий только 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:])
    
    06.07.2013
  • Спасибо посмотрю =) 07.07.2013
  • @Помоги мне А что потом? 09.07.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..