iambic 2011年02月18日
继续回复vivre_1“求助 python的问题”
http://topic.csdn.net/u/20110218/10/9d56ddb9-5cd7-4286-bc15-9b5b71d3a3e2.html

我本来想一边改一边回复,结果不能连续三次回复,vivre_1又结贴了,真悲剧。现在单独发帖回复吧。

vivre_1应该再精益求精点,把问题搞明白。虽然我之前给你的回复貌似可以解决问题,但实际上属于重写代码,还没有指出为什么你原来的代码不能工作。而且代码里里还有些其他的(风格上的)问题,也应该改掉。

……以下接之前的回复……

尽量少写循环。把内层的循环删掉了:

if __name__=='__main__':
links = map(completeLink, parseLinks("http://www.yxlink.com/index.html"))

i = 0
while i < len(links):
moreLinks = set(links) - set(map(completeLink, parseLinks(links[i])))
links.extend(moreLinks)
i += 1
print links


另外网页里拿到的链接可能有重复,所以简单去个重:
    links = list(set(links))



完整代码如下:
import urllib
import HTMLParser

class LinkParser(HTMLParser.HTMLParser):
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.links= []

def handle_starttag(self,tag,attrs):
print self.links
if tag == 'a':
for name, value in attrs:
if name == 'href':
self.links.append(value)

def parseLinks(url):
parser = LinkParser()
parser.feed(urllib.urlopen(url).read())
return parser.links

def completeLink(url):
root = "http://www.yxlink.com"
if url.startswith('http://'):
return url
elif url.startswith('/'):
return root + url
else:
return root + '/' + url

if __name__=='__main__':
links = map(completeLink, parseLinks("http://www.yxlink.com/index.html"))
links = list(set(links))

i = 0
while i < len(links):
moreLinks = set(links) - set(map(completeLink, parseLinks(links[i])))
links.extend(moreLinks)
i += 1
print links


那么,为什么你原来的代码不工作呢?这个貌似是因为HTMLParser.feed返回后,还有一部分数据没处理留在buffer里(具体为什么不太清楚)。你再次调用HTMLParser.feed,实际上是接着处理上次剩余的数据,然后好像上次剩余的数据又没处理完,所以相当于什么都没做。如果在掉次HTMLParser.feed之前调用下HTMLParser.reset,把那些剩下的东西删掉,应该也可以拿到结果。至于为什么HTMLParser.feed没处理完,你可能要仔细看看文档或者源代码搞清楚了。
...全文
86 点赞 收藏 7
写回复
7 条回复

还没有回复,快来抢沙发~

发动态
发帖子
脚本语言(Perl/Python)
创建于2007-08-27

1.5w+

社区成员

3.3w+

社区内容

其他开发语言 脚本语言(Perl ,Python)
社区公告
暂无公告