2016-06-28 5 views
1

Webクローラーを実装していますが、HTMLでリンクを解析しようとしています。私は完全なウェブサイトのパスに従うことができますが、いくつかの相対的なパスはちょっと変です。BeautifulSoupを使用して相対的なWebサイトパスから完全なWebサイトパスを取得する方法

私は、完全なパスをたどるすなわち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] 

しかし、時には、ウェブサイトのURLがhttp://foo.com/bar/bazで、 HTMLには、<a href='/bar/qux'のようなものがあります。ターゲットURLはhttp://foo.com/bar/quxである必要がありますが、私のコードはhttp://foo.com/bar//bar/quxです。

絶対パスが相対パスであることを知るために、2つのURLの間で一致する部分を特定する一般的な方法を知っている人はいますか?

答えて

1

私はいつも、それは今のところ私のために働いたことは、現在のページのURLをurljoin()を呼び出すことです:

>>> 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

@Brian迅速かつ不潔な修正は、 'url.rstrip("/")'を使用することですが、他のユースケースを破らないようにしてください。ありがとう。 – alecxe

関連する問題