【问题标题】:Python programing not going to else after break?Python编程在休息后不会继续吗?
【发布时间】:2021-12-16 19:32:33
【问题描述】:

在我的程序中,如果在 eg.10 的页面上没有找到数据,那么对于其余的页面,11 到 50,它不会进入 else 语句(应该会发生)。我是 python 新手,需要帮助在下面编写的代码中解决这个问题:

import concurrent
import functools
import concurrent.futures
import requests
from urllib3.exceptions import InsecureRequestWarning
import csv

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from bs4 import BeautifulSoup as bs

def download_page(session, page_no):
    url = 'https://bidplus.gem.gov.in/bidlists?d=1&page_no=' + str(page_no)
    print('URL created: ' + url)
    resp = session.get(url, verify=False)
    return resp.text


def scrap_bid_data():
    NUMBER_THREADS =5 # number of concurrent download requests
    with open('GEMconcurrent_1004.csv', 'w', newline='') as out_file:
        f = csv.writer(out_file)
        f.writerow(['Bidnumber', 'Items', 'Quantity', 'Department', 'Enddate','pageNumber'])
        with requests.Session() as session:
            page_downloader = functools.partial(download_page, session)
            with concurrent.futures.ThreadPoolExecutor(max_workers=NUMBER_THREADS) as executor:
                pages = executor.map(page_downloader, range(35, 36 ))
                page_no = 0
                for page in pages:
                    page_no += 1
                    soup_data = bs(page, 'lxml')
                    extracted_data = soup_data.find('div', {'id': 'pagi_content'})
                    if extracted_data is None or len(extracted_data) == 0:
                        print('No data at page number', page_no)
                        print(page)
                        break
                    else:
                        for idx in range(len(extracted_data)):
                            if (idx % 2 == 1):
                                bid_data = extracted_data.contents[idx].text.strip().split('\n')
                                if (len(bid_data)>1):
                                    print(page_no)
                                    if (len(bid_data[8]) > 1):

                                                            bidno = bid_data[0].split(":")[-1]
                                                            items = bid_data[8].split(":")[-1]
                                                            qnty = int(bid_data[9].split(':')[1].strip())
                                                            dept = (bid_data[10] + bid_data[15].strip()).split(":")[-1]
                                                            edate = bid_data[20].split("End Date:")[-1]
                                                            f.writerow([bidno, items, qnty, dept, edate,page_no])
scrap_bid_data()

【问题讨论】:

  • 请将您的代码缩减为minimal reproducible example,我们可以复制粘贴它并运行。
  • if成功时,程序遇到break,所以退出循环。删除它
  • 使用break 可以打破for 循环(for page in pages:)。为什么你希望程序在else 语句之后继续?
  • @MikeScotty 好的,我想知道 - 你如何使用自定义标题进行内联链接?如果你能指出我正确的方向,请

标签: python python-3.x beautifulsoup break code-formatting


【解决方案1】:

您的代码格式如下:

for p in pages:
   do stuff
   if condition:
      do stuff
      break
   else:

但如果您想在休息时运行else 子句,您需要将其格式化为与for loop 处于同一级别:

for p in pages:
    do stuff
    if condition:
        do stuff
        break
else:
   #i got here because of the break statement

【讨论】:

  • 你倒退了。如果迭代器用尽,则运行else 子句;如果break 退出循环,则跳过它。
【解决方案2】:

当你想离开条件(包含它的循环)时使用中断。

这里有更详细的解释https://www.programiz.com/python-programming/break-continue

我认为你不需要在这里使用 break。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2014-08-05
  • 2018-04-30
相关资源
最近更新 更多