首页 > 解决方案 > 嵌套的 while 循环不会按预期中断

问题描述

我有一个链接列表,对于每个链接,我想检查它是否包含特定的子链接并将此子链接添加到初始列表中。我有这个代码:

def getAllLinks():
    i = 0
    baseUrl = 'http://www.cdep.ro/pls/legis/'
    sourcePaths = ['legis_pck.lista_anuala?an=2012&emi=3&tip=18&rep=0','legis_pck.lista_anuala?an=2020&emi=3&tip=18&rep=0&nrc=1', 'legis_pck.lista_anuala?an=2010&emi=3&tip=18&rep=0']
    while i < len(sourcePaths)+1:
        for path in sourcePaths:
            res = requests.get(f'{baseUrl}{path}')
            soup = BeautifulSoup(res.text)

            next_btn = soup.find(lambda e: e.name == 'td' and '1..99' in e.text)
            if next_btn:
                for a in next_btn.find_all('a', href=True):
                    linkNextPage = a['href']
                    sourcePaths.append(linkNextPage)
                    i += 1
                break

            else:
                i += 1
                continue
            break

    return sourcePaths

print(getAllLinks())

列表中的第一个链接不包含子链接,所以这是一个else案例。代码可以做到这一点。但是,列表中的第二个链接确实包含子链接,但它卡在这里:

for a in next_btn.find_all('a', href=True):
    linkNextPage = a['href']
    sourcePaths.append(linkNextPage)
    i += 1

第三个链接包含子链接,但我的代码无法查看该链接。最后,我得到一个列表,其中包含初始链接加上第二个链接的子链接的 4 倍。

我想我在某个地方错误地打破了,但我不知道如何解决它。

标签: pythonfor-loop

解决方案


删除while. 这不是必需的。更改选择器

import requests
from bs4 import BeautifulSoup

def getAllLinks():
    baseUrl = 'http://www.cdep.ro/pls/legis/'
    sourcePaths = ['legis_pck.lista_anuala?an=2012&emi=3&tip=18&rep=0','legis_pck.lista_anuala?an=2020&emi=3&tip=18&rep=0&nrc=1', 'legis_pck.lista_anuala?an=2010&emi=3&tip=18&rep=0']

    for path in sourcePaths:
        res = requests.get(f'{baseUrl}{path}')
        soup = BeautifulSoup(res.text, "html.parser")

        next_btn = soup.find("p",class_="headline").find("table", {"align":"center"})
        if next_btn:
            anchor = next_btn.find_all("td")[-1].find("a")
            if anchor: sourcePaths.append(anchor["href"])
    return sourcePaths

print(getAllLinks())

输出:

['legis_pck.lista_anuala?an=2012&emi=3&tip=18&rep=0', 'legis_pck.lista_anuala?an=2020&emi=3&tip=18&rep=0&nrc=1', 'legis_pck.lista_anuala?an=2010&emi=3&tip=18&rep=0', 'legis_pck.lista_anuala?an=2020&emi=3&tip=18&rep=0&nrc=100', 'legis_pck.lista_anuala?an=2010&emi=3&tip=18&rep=0&nrc=100']

推荐阅读