【发布时间】:2016-04-10 10:39:12
【问题描述】:
我想使用 Python 获取给定“根”URL(在列表中)的域中的所有链接。假设给定一个 URL http://www.example.com 这应该返回与根 URL 相同域的此页面上的所有链接,然后递归访问这些链接中的每一个并提取相同域的所有链接等等。我所说的相同域的意思是,如果给定http://www.example.com,我想要返回的唯一链接是http://www.example.com/something、http://www.example.com/somethingelse ...任何外部的东西,例如http://www.otherwebsite.com,都应该被丢弃。如何使用 Python 做到这一点?
编辑:我尝试使用 lxml。我不认为这完全有效,我不确定如何考虑到已处理页面的链接(导致无限循环)。
import urllib
import lxml.html
#given a url returns list of all sublinks within the same domain
def getLinks(url):
urlList = []
urlList.append(url)
sublinks = getSubLinks(url)
for link in sublinks:
absolute = url+'/'+link
urlList.extend(getLinks(absolute))
return urlList
#determine whether two links are within the same domain
def sameDomain(url, dom):
return url.startswith(dom)
#get tree of sublinks in same domain, url is root
def getSubLinks(url):
sublinks = []
connection = urllib.urlopen(url)
dom = lxml.html.fromstring(connection.read())
for link in dom.xpath('//a/@href'):
if not (link.startswith('#') or link.startswith('http') or link.startswith('mailto:')):
sublinks.append(link)
return sublinks
~
【问题讨论】:
-
从问题标签看来您已经知道该使用什么了。也许你可以展示你尝试过的东西,否则我认为这个问题太笼统了。有一些网络抓取框架,例如 scrapy,可能会对您有所帮助。
-
这个问题比较难,页面中的一些链接没有协议前缀,提供本地路径。 “..”是一个有效的 URL。你想关注什么而不是关注什么?
-
我只想关注以根 URL 为前缀的任何内容。但是,一些相对链接没有以根 URL 为前缀,但如果我将根 URL 附加到它们之前,它们将是有效的。我也想要这些。
标签: python web-scraping beautifulsoup lxml