1

首先,如果我使用了错误的术语或者我对基本概念的理解有缺陷,请原谅我。我只是在学习如何构建使用类的脚本......并且是 Python/编码的相对新手。

原则上,我很想知道是否有办法在一个类中调用同一个函数两次。如果我简要解释一下我正在尝试做的事情,那可能会有些道理......

我正在尝试编写一个 Web 'scraper' 来解析种子网页,根据一些给定的参数返回 URL,遵循这些 URL,做同样的事情(可能 n 次),最后在链接底部返回一个 pdf。这是为了加快我的同事目前手动收集的一些内容。(通过我之前相对基本的迭代,我节省了字面人几个月的手动工作。)

这是我目前使用的一种方法,但我编写的代码并不是真正可扩展或易于重用的,我想尝试使其更加通用(我目前正在为每个实例手动滚动脚本)。

(我认为)我想构建一个名为 siteInstance 的类,用于保存种子 url、保存位置、标题、u:p、cookie 和各种功能。我用来浏览网站以获取目标内容。

我使用了一个重复的函数来解析目标 URL 并返回下一层 URL。这些基于某些特定于站点的 RegEx,因此我知道我必须为每一层 URL 提供搜索过滤器 (regEx)。我希望能够重用解析器,但使用特定于层的正则表达式来提供它。DRY 是对的吗?

在我看来,这意味着我有一个名为 siteInstance.parser 的函数,我在每个 siteInstance.class 中构造了一些(例如siteInstance.parserA,对于第一层,siteInstance.parserB对于第二层......siteInstance.parsern对于第 n 层)

Follows 是一个简化版本,实际上在每一层都有许多清理/准备步骤,以正确生成下一层的目标 URL 列表。这包括为保存的二进制文件制作文件结构、写入日志以及为该层触发 RegEx 等。

这是一个两层示例,但我知道至少有 4 层可以满足的实例。

示例:种子 {URL:www.journalTitle.com}

第一遍(Layer1)的结果: [{IssueURL2010:www.journalTitle.com/2010},{IssueURL2011:www.journalTitle.com/2011},{IssueURL2012:www.journalTitle.com/2012},{IssueURLn:www.journalTitle.com/n}]

对于 IssueURL2010(第 2 层): [{article1_2010URL:www.journalTitle.com/2010/1},{article2_2010URL:www.journalTitle.com/2010/2},{article3_2010URL:www.journalTitle.com/2010/3},{articlen_2010URL:www.journalTitle.com/2010/n}]

article1_2010UR我可以得到www.journalTitle.com/2010/1.pdf

我希望这是有道理的...

4

1 回答 1

2

您可以在单独的类中定义解析逻辑,并在实例(或类)属性中将其实例化几次:

class URLParser(object):
    def __init__(self, regexp, ...):
        self.regexp = regexp
        ...

    def parse_urls(self, urls):
        # do your URL parsing thing
        # return parsed URLs

class SiteInstance(object):
    def __init__(self, ...):
        self.parsers = [
            URLParser('regexp1'),
            URLParser('regexp2'),
            ...
        ]

    def parse(self, ...):
        ...
        for parser in self.parsers:
            parser.parse_urls(...)
于 2012-10-09T05:47:34.967 回答