首先,如果我使用错误的术语或者我对基本概念的理解存在缺陷,请原谅我。我只是学习如何构建使用类的脚本......并且是Python /编码的相对新手。
原则上,我很想知道是否有一种方法可以在一个类中调用两次相同的func。如果我简要解释一下我想要做什么,那可能会有所帮助......
我正在尝试编写一个web'scraper'来解析一个种子网页,根据一些给定的参数返回URL,跟踪这些URL,做同样的事情(可能是n次),最后在底部返回一个pdf链接。这是为了加快我的同事目前手动收集的一些内容。 (我已用相对基本的前一次迭代保存了几个月的手动工作量。)
这是我目前使用的一种方法,但我编写的代码实际上不是可扩展的,也不是可以重复使用的,我想尝试使其更具通用性(我现在正在为每个实例编写脚本)。
(我认为)我想构建一个名为siteInstance的类,用于保存种子URL,保存位置,标题,u:p,cookie和各种函数。我用来遍历网站以获取目标内容。
我使用了一个重复的函数来解析目标URL并返回下一层URL。这些是基于某些特定于站点的RegEx,因此我知道我必须为每个URL层提供搜索过滤器(regEx)。我希望能够重用解析器,但需要使用特定于层的Regex。干是对的吗?
在我看来,这意味着我有一个名为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
我希望这是有道理的......
答案 0 :(得分: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(...)