如何在不中断包含循环的循环的情况下中断循环?

2024-04-26 14:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个定义类的代码:Webpage和crwaler。 目标:建立一个通用的搜索引擎。 我在电脑上找到一个文件夹,里面有几个html格式的“网页”。我很抱歉所有的代码,但我不知道如何使这个问题没有它具体。你知道吗

import re
import os

def remove_html_tags(s):
    tag = False
    quote = False
    out = ""

    for c in s:
            if c == '<' and not quote:
                tag = True
            elif c == '>' and not quote:
                tag = False
            elif (c == '"' or c == "'") and tag:
                quote = not quote
            elif not tag:
                out = out + c

    return out


def lev(s1, s2):
    return lev_iter(s1, s2, dict())

def lev_iter(s1, s2, mem):

    (i,j) = (len(s1), len(s2))
    if (i,j) in mem:
        return mem[(i,j)]

    s1_low = s1.lower()
    s2_low = s2.lower()
    if len(s1_low) == 0 or len(s2_low) == 0:
        return max(len(s1_low), len(s2_low))
    d1 = lev_iter(s1_low[:-1], s2_low, mem) + 1
    d2 = lev_iter(s1_low, s2_low[:-1], mem) + 1
    last = 0 if s1_low[-1] == s2_low[-1] else 1
    d3 = lev_iter(s1_low[:-1], s2_low[:-1], mem) + last
    result = min(d1, d2, d3)

    mem[(i,j)] = result

    return result




""" A Class that holds data on a Web page """
class WebPage:

    def __init__(self, filename):

        self.filename = filename

    def process(self):

        f = open(self.filename,'r')
        LINE_lst = f.readlines()

        self.info = {}

        for i in range(len(LINE_lst)):
            LINE_lst[i] = LINE_lst[i].strip(' \n\t')
            LINE_lst[i] = remove_html_tags(LINE_lst[i])
        lines = LINE_lst[:]
        for line in lines:
            if len(line) == 0:
                LINE_lst.remove(line)
        self.body = ' '.join(LINE_lst[1:])
        self.title = LINE_lst[0]
        f.close()

    def __str__(self):
        return self.title + '\n' + self.body

    def __repr__(self):
        return self.title

    def __eq__(self,other):
        n = lev(self.body,other.body)
        k = len(self.body)
        m = len(other.body)
        return float(n)/max(k,m) <= 0.15

    def __lt__(self,other):
        return self.title < other.title

""" A Class that crawls the web """     
class Crawler:
    def __init__(self, directory):

        self.folder = directory

    def crawl(self):

        pages = [f for f in os.listdir(self.folder) if f.endswith('.html')]

        final_list = []

        for page in pages:

            page = WebPage(self.folder + '\\' + page)
            page.process()

            for k in range(len(final_list)+1):

                if k == len(final_list):

                    final_list.append(page)

                elif page == final_list[k]:
                    if page < final_list[k]:
                        final_list.remove(final_list[k])
                        final_list.append(page)

        self.crawl = final_list

嗯。。除了crawl方法之外,其他方法都可以工作。 也许我做错了我不知道。 我想在k等于最终的_列表的长度时中断循环,但不中断包含它的循环。 有什么建议吗?你知道吗


Tags: inselflenreturnifdeflinepage