如何使用Python获取一个域中的所有链接?

j x*_*j x 6 python lxml beautifulsoup web-scraping

我想使用 Python 获取给定“根”URL 的域中的所有链接(在列表中)。假设给定一个 URL http://www.example.com,这应该返回该页面上与根 URL 相同域的所有链接,然后递归访问这些链接中的每一个并提取相同域的所有链接,很快。我所说的相同域的意思是,如果给定http://www.example.com ,我想要返回的唯一链接是http://www.example.com/somethinghttp://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
Run Code Online (Sandbox Code Playgroud)

小智 -1

从你问题的标签来看,我假设你正在使用 Beautiful Soup。首先,您显然需要下载网页,例如使用 urllib.request。完成此操作并将内容放入字符串后,将其传递给 Beautiful Soup。之后,您可以使用 soup.find_all('a') 找到所有链接,假设 soup 是您漂亮的 soup 对象。之后,您只需检查 href:

最简单的版本是仅检查“ http://www.example.com ”是否在 href 中,但这不会捕获相对链接。我想一些狂野的正则表达式会做(查找以“www.example.com”或以“/”开头或以“?”开头(php)的所有内容),或者您可能会查找包含 www 的所有内容,但不是www.example.com 并丢弃它,等等。正确的策略可能取决于您正在抓取的网站及其编码风格。