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, чтобы он по существу доверял вам и игнорировал ошибку, чтобы он мог продолжать работу до своего дня.