Python小程序:用广度优先搜索算法查询两个url之间的最短路径
2016-11-28 01:53
597 查看
源自人工智能一次作业中的一道题
本人Python小白啊,真的要好好努力了。话不多说,直接上代码。
查找过程如下:
查询结果如下:
提示成功找到目标url, 打印最短路径,并显示查询时间。
本人Python小白啊,真的要好好努力了。话不多说,直接上代码。
#encoding:UTF-8 import time from lxml import etree import urllib2 import Queue import requests requests.packages.urllib3.disable_warnings() def findUrl(url): # 查找Url对应页面包含的子url try: links = [] res = requests.get(url, timeout=0.6) # 获取requests发出get请求后的response对象 html = etree.HTML(res.text) # etree解析响应体的字符串形式 newurls = html.findall('.//a') # 找到所有的a标签 for newURL in newurls: href = newURL.get('href') # 获取href链接 links.append(href) return links except Exception as e: pass def printPath(parents, startUrl, targetUrl): # 寻找从初始url到目标url的路径 try: print "\nThe path from %s to %s: " % (startUrl, targetUrl) path = [targetUrl] parent = parents[targetUrl] # 寻找父亲 while bool(parent) == True: path.append(parent) parent = parents[parent] path = path[::-1] # 列表反转 print "\n-> ".join(path) except Exception as e: pass def search(startUrl, targetUrl): queue = Queue.Queue() # 队列 存储 未访问的url visited = set() # 集合 存储 访问过的url parents = dict() # 字典 存储 父url parents[startUrl] = None # 起始url为祖先 queue.put(startUrl) # BFS开始前先将源url推进队列 visited.add(startUrl) # 初始节点标记访问 while (queue.empty() == False): # 队列非空 try: curentUrl = queue.get() # 取出队列首部并pop掉 print('search in %s ...' % curentUrl) # 找出当前url的所有子url urlLink = findUrl(curentUrl) if urlLink: for url in urlLink: parents[url] = curentUrl # 记录当前url与子url的对应关系 if (url == targetUrl): print('find %s successfully\n' % targetUrl) printPath(parents, startUrl, targetUrl) # 打印路径 return if (url not in visited): # 如果子url还未访问过,推进队列并标记访问 queue.put(url) visited.add(url) except Exception as e: pass if __name__ == '__main__': startTime = time.time() search('http://helpdesk.sysu.edu.cn/', 'http://tv.sysu.edu.cn/') print ("\nCost time: %f s" % (time.time() - startTime))
查找过程如下:
查询结果如下:
提示成功找到目标url, 打印最短路径,并显示查询时间。
相关文章推荐
- 在有向图中找两个点之间最短路径的方法总结
- 两个城市之间寻找最短路径问题(广度优先搜索)
- 二叉树系列——二叉树中任意两个节点之间的最短路径
- Python-通过Dijkstra计算两点之间的最短路径
- 用Python实现Dijkstra算法用来寻找两点之间的最短路径 (Implementation of Dijkstra in Python)
- 弗洛伊德算法得到图中任意两个顶点之间的最短路径
- 求任意两个点之间的最短路径
- LCA算法求任意两个节点之间的最小公共祖先(最短路径)
- 实现教科书图7.33的程序(另加孤立顶点台北)(两城市之间的最短路径模拟)
- 此小程序用于输入两个坐标,输出他们之间的距离
- acm题目及我的程序(2)——Knight Moves (骑士跳跃) ——任意两点间的最短路径所有信息(算法1)
- Android基础教程之----SMS简单发送短信程序(两个模拟器之间的通信)!
- 调试用Python C API 写的程序问题还真多,关于import搜索路径的,复制过来,以防忘记
- asp.net程序在调式和发布之间图片路径问题的解决方法
- asp.net程序在调式和发布之间图片路径问题的解决方法
- 找两个对角线顶点之间的路径
- sicily 1889解题报告(bfs维护两个队列,实现最短路径)
- 单源最短路径两个重要算法
- 此小程序用于输入两个坐标,输出他们之间的距离
- 两个不同数据库之间的两个表如何关联起来查询数据