+ -
当前位置:首页 → 问答吧 → 关于urllister.py的求助

关于urllister.py的求助

时间:2011-03-03

来源:互联网

from sgmllib import SGMLParser
class URLLister(SGMLParser):
  def reset(self):。。。。。。。。。。。。。。。。。(1)
  SGMLParser.reset(self)
  self.urls = []
  def start_a(self, attrs):。。。。。。。。。。。。(2)
  href = [v for k, v in attrs if k=='href']。。。。(3)(4)
  if href:
  self.urls.extend(href)

(1)reset 由 SGMLParser 的 __init__ 方法来调用,也可以在创建一个分析器实例时手工来调
用。所以如果您需要做初始化,在 reset 中去做,而不要在 __init__ 中做。这样当某人重
用一个分析器实例时,可以正确地重新初始化。
(2)只要找到一个 <a> 标记,start_a 就会由 SGMLParser 进行调用。这个标记可以包含一个
href 属性,或者包含其它的属性,如 name 或 title。attrs 参数是一个 tuple 的
list,[(attribute, value), (attribute, value), ...]。或者它可以只是一个有效
的 HTML 标记 <a> (尽管无用),这时 attrs 将是个空 list。
(3)我们可以通过一个简单的多变量 list 映射 来查找这个 <a> 标记是否拥有一个 href 属性。
(4)像 k=='href' 的字符串比较是区分大小写的,但是这里是安全的。因为 SGMLParser 会在创
建 attrs 时将属性名转化为小写。

小弟初学python,有几处不懂,让各位见笑:
在(2)中说只要找到一个<a>标记,start_a就会由SGMLParser调用,标记<a>是什么,程序里并没有出现啊。
另外为什么会被SGMLParser调用,start_a不是自己定义的函数吗。
怎么看出href是<a>的一种属性的,可否解释一下:href = [v for k, v in attrs if k=='href']。

作者: tziyachi5252   发布时间: 2011-03-03

程序里没有<a>,是因为程序里没有输入。你随便打开一个网页,用浏览器查看源代码,然后搜<a,就知道了。<a>tag和属性都是基本的HTML知识,你自己补下html吧。
[v for k, v in attrs if k=='href']你google下python list comprehension。

作者: iambic   发布时间: 2011-03-03