Как я могу разорвать цикл, когда больше нет элементов для добавления в список?

#python #list #append

#python #Список #добавить

Вопрос:

Я пишу скрипт, который извлекает внутренние ссылки с веб-сайта. Когда он переходит к внутренним ссылкам в списке, он добавляет нераспознанные ссылки в список.

Когда он добавит все внутренние ссылки, я хочу разорвать цикл.

 addr = "http://andnow.com/"
base_addr = "{0.scheme}://{0.netloc}/".format(urlsplit(addr))

o = urlparse(addr)
domain = o.hostname

i_url = []

def internal_crawl(url):

    headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0'}

    r = requests.get(url, headers = headers).content
    soup = BeautifulSoup( r, "html.parser")

    i_url.append(url)
    try:
        for link in [h.get('href') for h in soup.find_all('a')]:
            if domain in link and "mailto:" not in link and "tel:" and not link.startswith('#'):
                if link not in i_url:
                    i_url.append(link)
#               print(link)
            elif "http" not in link and "tel:" not in link and "mailto:" not in link and not link.startswith('#'):
                internal = base_addr   link
                if link not in i_url:
                    i_url.append(internal)
        print(i_url)

    except Exception:
        print("exception")

internal_crawl(base_addr)

for l in i_url:
    internal_crawl(l)
  

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

 for x in i_url:
    if x == i_url[-1]:
        break
  

Есть ли способ разорвать цикл, если один и тот же элемент является последним в списке дважды подряд?

Комментарии:

1. В общем, изменять контейнер, через который вы выполняете итерацию, — плохая идея.

2. Спасибо за ответ. Я все еще изучаю это, но это может быть проблемой.

Ответ №1:

Не совсем уверен, что вы пытаетесь сделать. Если я правильно понимаю, одним из способов было бы:

 prev = None
for x in i_url:
    if x == prev:
        break
    # do stuff
    prev = x
  

Ответ №2:

Это то, что вам нужно:

 y = None
i_url = ["x", "y","z", "z","a"]
for x in i_url:
  if x==y :
    print ("found ", x)
    break
  else:
    y=x