2016-06-28 56 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