我正在阅读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
答案 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函数填充的字段。