2016-06-28 54 views
1

我正在实现一个网络爬虫,我试图解析HTML中的链接。我可以遵循完整的网站路径,但一些相对路径有点奇怪。如何使用BeautifulSoup从相关网站路径获取完整的网站路径

我可以按照完整路径,即http://foo.com/bar/baz,我能找到一种方法,通过使用以下功能遵循相对路径,即/qux

def baseUrl(url): 
    u = urlparse.urlparse(url) 
    return "{}://{}{}/".format(u.scheme, u.netloc, '/'.join(u.path.split('/')[:-1])) 

def fullUrl(url, parent): 
    u = urlparse.urlparse(url) 
    if u.scheme: 
     return url.split("/#")[0] 
    else: 
     return "{}{}".format(baseUrl(parent), url).split("/#")[0] 

但有时,网站的网址是http://foo.com/bar/baz,和在HTML中,有一些像<a href='/bar/qux'。目标网址应该是http://foo.com/bar/qux,但我的代码是输出http://foo.com/bar//bar/qux

有没有人知道一个通​​用的方法来弄清楚两个URL之间的哪些部分匹配,以便找出完整路径将来自相对路径?

回答

1

我总是做和它的工作对我来说,到目前为止是调用urljoin()与当前页面的URL:

>>> from urlparse import urljoin 
>>> urljoin("http://foo.com/bar/baz", "/bar/qux") 
'http://foo.com/bar/qux' 
+0

这正是我需要的。谢谢! – Brian

+0

我有另一个(相关)问题。有时候,当我爬行的时候,我去的URL会是'http:// foo.com/bar',然后重定向到'http:// foo.com/bar /'。由于重定向,它会查找不正确的相对路径。你知道我该如何解决这个问题吗? 再次感谢您! – Brian

+0

@布赖恩快速和肮脏的修复将使用'url.rstrip(“/”)',但请确保它不会破坏其他用例。谢谢。 – alecxe