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/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
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 并丢弃它,等等。正确的策略可能取决于您正在抓取的网站及其编码风格。