任何人都可以解释list-urls.py

时间:2012-06-16 17:36:40

标签: python

我正在阅读Dive in Python,特别是试图理解这些例子,我对list-urls.py有一些疑问。

在最后一行中,它编译了“parser.urls”中的URL列表。这些数据来自哪里?我在URLLister或SGMLparser中没有看到urls方法。

还创建了一个方法start_a但从未使用过。这是什么?

链接到完整代码,下面是精简版http://pastebin.com/EbB4micK

#!/usr/bin/python
"""Extract list of URLs in a web page"""

from sgmllib import SGMLParser
import sys

class URLLister(SGMLParser):
    def reset(self):
            SGMLParser.reset(self)
            self.urls = []

    def start_a(self, attrs):
            href = [v for k, v in attrs if k=='href']
            if href:
                    self.urls.extend(href)

if __name__ == "__main__":

    link = sys.argv[1]
    try:
            usock = urllib.urlopen(link)
            parser = URLLister()
            parser.feed(usock.read())
            parser.close()
            usock.close()
            for url in parser.urls: print url

3 个答案:

答案 0 :(得分:1)

这是一个属性,在方法中绑定和变异。

        self.urls = []

...

                self.urls.extend(href)

start_a()SGMLParser协议的一部分,其中URLLister是后代。

  

除了覆盖或扩展上面列出的方法之外,派生类还可以定义以下形式的方法来定义特定标记的处理。输入流中的标记名称与大小写无关;方法名称中出现的标记必须为小写:

答案 1 :(得分:0)

parser.urls是URLLister中的“self.urls”。你需要研究sgmllib.SGMLParser的来源,以了解“feed”的内部结构以及它与URLLister中定义的方法的关系。

答案 2 :(得分:0)

start_a是SGML Parser用来处理'a'标签的函数。 请参阅SGML Parser docs中的函数start_tag。 parser.urls只是包含url并由start_a函数填充的字段。