首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语句在不工作的for循环中运行。

语句在不工作的for循环中运行。
EN

Stack Overflow用户
提问于 2017-08-24 00:38:48
回答 4查看 8.8K关注 0票数 2

使用以下代码,我无法中断循环:

代码语言:javascript
复制
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“的所有新版本)。

我做了一些研究,发现我应该打破所有的循环,但是当我尝试这段代码时,控制台上什么都没有打印出来:

代码语言:javascript
复制
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

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-08-24 00:42:17

实际上,他们正在工作,完全按照设计。这不一定与某些人认为他们应该工作的方式相同:-)

外部循环和中间循环的break语句将被执行,而不管内部break是否已经发生。换句话说,它们是无条件的,所以这些循环只执行一次。

你可以用这样的方法解决这个问题:

代码语言:javascript
复制
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

另一种可能(可能是“更干净的”)是将其重构为一个函数:

代码语言:javascript
复制
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

用以下方式称呼它:

代码语言:javascript
复制
printOne(all_asides)
票数 4
EN

Stack Overflow用户

发布于 2017-08-24 00:50:50

在第一种情况下,您会在for循环的末尾中断,但是下一个for循环仍然会运行。在第二种情况下,在第一个for循环的第一次迭代之后立即中断,并一次性保留所有循环。

另一个答案提到使用一系列的if语句作为中断,您也可以使用异常处理来执行多级中断。

代码语言:javascript
复制
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

see here获取打破多个级别的更多方法。

票数 1
EN

Stack Overflow用户

发布于 2017-08-24 00:45:18

一个丑陋的黑客(.好吧,好吧,一个完全的和完全的厌恶),除了最外面的循环:

代码语言:javascript
复制
for ...:
   ...
else:
  continue
break
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45851222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档