使用以下代码,我无法中断循环:
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谢谢。
发布于 2017-08-24 00:42:17
实际上,他们正在工作,完全按照设计。这不一定与某些人认为他们应该工作的方式相同:-)
外部循环和中间循环的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)发布于 2017-08-24 00:50:50
在第一种情况下,您会在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:
passsee here获取打破多个级别的更多方法。
发布于 2017-08-24 00:45:18
一个丑陋的黑客(.好吧,好吧,一个完全的和完全的厌恶),除了最外面的循环:
for ...:
...
else:
continue
breakhttps://stackoverflow.com/questions/45851222
复制相似问题