for循环中的break语句不起作用

时间:2017-08-24 00:38:49

标签: python for-loop web-scraping break

使用以下代码,我无法摆脱循环:

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

谢谢。

4 个答案:

答案 0 :(得分:4)

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

外部和中间循环的X = tf.placeholder(dtype=tf.float32, shape=[100,28,28,1]) W = tf.get_variable(...) Y = tf.matmul(X,W) print(Y.get_shape()[0].value) 语句将执行,无论内部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

答案 1 :(得分:1)

在第一种情况下,在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

see here了解更多打破多个级别的方法。

答案 2 :(得分:0)

对于除了最外层的循环之外的所有人来说,有点丑陋的黑客(......好吧,很好,完全和完全可憎):

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

答案 3 :(得分:0)

也许上面的答案也是对的,但也可能有另一种罕见的情况。

如果您使用 PyCharm 进行调试,也有可能您编辑了代码并且代码行在视觉上向上/向下移动但它不会被解释/执行< /strong> 直到调试会话重新启动

很明显,重新启动调试会话效果很好...