簡體   English   中英

for 循環中的 break 語句不起作用

[英]break statement inside a for loop not working

使用以下代碼,我無法打破循環:

import requests
from bs4 import BeautifulSoup


link = "http://www.wuxiaworld.com/"

html = requests.get(link)
soup = BeautifulSoup(html.content, "html.parser")

all_aside = soup.find_all("aside", id="recent-posts-2")
for aside in all_aside:
    for li in aside.find_all("li"):
        for a in li.find_all("a"):
            if "ATG" in a.text:
                print(a.text)
                break

我想制作一個腳本,以便在故事的新章節發布時通知我。 我剛剛開始制作它,但我被困在這里(它打印了最近帖子中包含字符串“ATG”的所有新版本)。

我做了一些研究,發現我應該打破所有循環,但是當我嘗試這段代碼時,控制台沒有打印任何內容:

import requests
from bs4 import BeautifulSoup


link = "http://www.wuxiaworld.com/"

html = requests.get(link)
soup = BeautifulSoup(html.content, "html.parser")

all_aside = soup.find_all("aside", id="recent-posts-2")
for aside in all_aside:
    for li in aside.find_all("li"):
        for a in li.find_all("a"):
            if "ATG" in a.text:
                print(a.text)
                break
        break
    break

謝謝。

實際上,它們正在工作,完全按照設計。 這不一定與某些人認為他們應該工作的方式相同:-)

無論內部break是否發生,外循環和中循環的break語句都將被執行。 換句話說,它們是無條件的,所以這些循環只會執行一次。

您可以通過以下方式解決此問題:

foundIt = False
for aside in all_aside:
    for li in aside.find_all("li"):
        for a in li.find_all("a"):
            if "ATG" in a.text:
                print(a.text)
                foundIt = True
                break
        if foundIt: break
    if foundIt: break

另一種可能性(可能是“更干凈”)是將其重構為一個函數:

def printOne(asides):
    for aside in asides:
        for li in aside.find_all("li"):
            for a in li.find_all("a"):
                if "ATG" in a.text:
                    print(a.text)
                    return

並調用它:

printOne(all_asides)

在第一種情況下,您在 for 循環結束時中斷,但下一個 for 循環仍將運行。 在第二種情況下,在第一個 for 循環的第一次迭代后立即中斷,並立即離開所有循環。

另一個答案提到對中斷使用一系列 if 語句您還可以使用異常處理來執行多級中斷。

class BreakException(Exception):
    pass
try:
    for aside in all_aside:
        for li in aside.find_all("li"):
            for a in li.find_all("a"):
                if "ATG" in a.text:
                    print(a.text)
                    raise BreakException
except BreakException:
    pass

有關打破多個級別的更多方法,請參見此處

有點丑陋的黑客(......好吧,好吧,一個完全和徹底的憎惡),除了最外層的循環:

for ...:
   ...
else:
  continue
break

也許上面的答案也是正確的,但也可能有另一種罕見的情況。

如果您正在使用 PyCharm進行調試,也有可能您已經編輯了代碼並且代碼行在視覺上向上/向下移動,但在調試會話重新啟動之前不會被解釋/執行

顯然,重新啟動調試會話效果很好......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM