首先說下什么叫URL拼接,我們有這么一個HTML片段:
<
a href="../../a.html">click me</a>
做為一只辛苦的爬蟲,我們要跟蹤到這個click me指向的頁面,假設這個片段來自:http://www.xxxdu.com,那么目標頁面是什么呢?
顯然不是
而是
第一個結果看着很腦殘,但是這就是Python的urljoin給出的結果,按理說urljoin應該解決這個“路徑非正規化”(Normalize path )的問題,但是它沒有:
OK,其實這個問題的解決根本不再URL上,因為URL已經拼接了,更准確的描述這個問題應該是路徑的正規化,即xxx.com后面的這部分路徑,如果我們把它想象成Unix路徑,不就是求相對論路徑”/../../a.html”的絕對路徑么?
我們可以用查找、正則表達式把后面這部分分離出來,更省事的方法是urlparse:
上述結果的第2部分, arr[2]就是我們要的path啦。
然后Python提供了Unix路徑的正規化函數posixpath.normpath
最后我們把正規化好的path重新組裝成url,於是整個函數出爐:
輸出結果: