Если я правильно понимаю, вы хотите посетить каждую страницу только один раз. Я думаю, что лучший способ сделать это - сохранить очередь посещаемых страниц и набор посещенных страниц. Проблема с другим опубликованным решением состоит в том, что, как только вы извлекаете страницу из очереди, у вас больше нет записи о том, были ли вы там или нет.
Я бы использовал комбинацию набора и списка:
visited = set()
to_visit = []
def queue_page(url):
if url not in visited:
to_visit.append(url)
def visit(url):
visited.add(url)
... # some processing
# Add all found links to the queue
for link in links:
queue_page(link)
def page_iterator(start_url):
visit(start_url)
try:
yield to_visit.pop(0)
except IndexError:
raise StopIteration
for page in page_iterator(start):
visit(page)
Конечно, это немного надуманный пример, и вам, вероятно, лучше всего это как-то инкапсулировать, но это иллюстрирует концепцию.