Python: вернуть пустое значение при исключении

У меня есть некоторый опыт работы с Python, но я никогда не использовал функции try & кроме, чтобы ловить ошибки из-за отсутствия формального обучения.

Я работаю над извлечением нескольких статей из Википедии. Для этого у меня есть массив заголовков, некоторые из которых не имеют ни статьи, ни результата поиска в конце. Я хотел бы, чтобы функция поиска страниц просто пропускала эти несколько имен и продолжала запускать скрипт для остальных. Воспроизводимый код следует.

import wikipedia
# This one works.
links = ["CPython"]
test = [wikipedia.page(link, auto_suggest=False) for link in links]
test = [testitem.content for testitem in test]
print(test)

#The sequence breaks down if there is no wikipedia page.
links = ["CPython","no page"]
test = [wikipedia.page(link, auto_suggest=False) for link in links]
test = [testitem.content for testitem in test]
print(test)

Библиотека, в которой он работает, использует такой метод. Обычно это было бы очень плохой практикой, но, поскольку это только для одноразового извлечения данных, я хочу изменить локальную копию библиотеки, чтобы заставить ее работать. Редактировать Я включил полную функцию сейчас.

def page(title=None, pageid=None, auto_suggest=True, redirect=True, preload=False):
  '''
  Get a WikipediaPage object for the page with title `title` or the pageid
  `pageid` (mutually exclusive).

  Keyword arguments:

  * title - the title of the page to load
  * pageid - the numeric pageid of the page to load
  * auto_suggest - let Wikipedia find a valid page title for the query
  * redirect - allow redirection without raising RedirectError
  * preload - load content, summary, images, references, and links during initialization
  '''
  if title is not None:
    if auto_suggest:
      results, suggestion = search(title, results=1, suggestion=True)
      try:
        title = suggestion or results[0]
      except IndexError:
        # if there is no suggestion or search results, the page doesn't exist
        raise PageError(title)
    return WikipediaPage(title, redirect=redirect, preload=preload)
  elif pageid is not None:
    return WikipediaPage(pageid=pageid, preload=preload)
  else:
    raise ValueError("Either a title or a pageid must be specified")

Что я должен сделать, чтобы получить только те страницы, которые не дают ошибки. Может быть, есть способ отфильтровать все элементы в списке, которые дают эту ошибку или какую-то ошибку. Возврат "NA" или подобный будет хорошо для страниц, которые не существуют. Пропускать их без уведомления тоже было бы хорошо. Спасибо!

2 ответа

Решение

Функция wikipedia.page поднимет wikipedia.exceptions.PageError если страница не существует Это ошибка, которую вы хотите уловить.

import wikipedia
links = ["CPython","no page"]
test=[]
for link in links:
    try:
        #try to load the wikipedia page
        page=wikipedia.page(link, auto_suggest=False)
        test.append(page)
    except wikipedia.exceptions.PageError:
        #if a "PageError" was raised, ignore it and continue to next link
        continue

Вы должны окружить функцию wikipedia.page с помощью блока try, так что, боюсь, вы не сможете использовать понимание списка.

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

редактировать: подождите, извините. Я только что заметил понимание списка. Я на самом деле не уверен, будет ли это работать, не ломая это:

links = ["CPython", "no page"]
test = []
for link in links:
    try:
        page = wikipedia.page(link, auto_suggest=False)
        test.append(page)
    except wikipedia.exceptions.PageError:
        pass
test = [testitem.content for testitem in test]
print(test)

pass Говорит Python, чтобы он по существу доверял вам и игнорировал ошибку, чтобы он мог продолжать работу до своего дня.

Другие вопросы по тегам