0

我正在阅读 Dive into 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
4

3 回答 3

1

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

        self.urls = []

...

                self.urls.extend(href)

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

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

于 2012-06-16T17:41:14.623 回答
0

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

于 2012-06-16T17:42:14.810 回答
0

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

于 2012-06-16T17:43:46.123 回答