[英]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.