2012-03-15 21 views
17

ページの絶対URL、およびそのページ内で見つかった相対リンクを考えると、への道があるだろうA)決定的に再構築またはB)ベストエフォート型の再構築相対リンクの絶対URL?ページに相対URLから絶対URLを再構築

私の場合は、美しいスープを使って、特定のURLからhtmlファイルを読み込み、すべてのimgタグソースを取り除き、ページイメージへの絶対URLのリストを作成しようとしています。

function get_image_url(page_url,image_src): 

    from urlparse import urlparse 
    # parsed = urlparse('http://user:[email protected]:80/path;parameters?query=argument#fragment') 
    parsed = urlparse(page_url) 
    url_base = parsed.netloc 
    url_path = parsed.path 

    if src.find('http') == 0: 
     # It's an absolute URL, do nothing. 
     pass 
    elif src.find('/') == 0: 
     # If it's a root URL, append it to the base URL: 
     src = 'http://' + url_base + src 
    else: 
     # If it's a relative URL, ? 

注:はPythonの答えは、必要なだけのロジックを必要としないでください

私のPythonの関数は、これまでのように見えます。

答えて

34

非常にシンプル:

>>> from urlparse import urljoin 
>>> urljoin('http://mysite.com/foo/bar/x.html', '../../images/img.png') 
'http://mysite.com/images/img.png' 
+0

Hey coool !! (私がPythonを必要としたと推測した..) – Yarin

+10

urlparseモジュールの名前がPython 3のurllib.parseに変更された。したがって、 'urllib.parse import urljoin' – SparkAndShine

13

使用urllib.parse.urljoinベースURLに対する(おそらく相対)URLを解決します。 HTMLページがその好ましいベースURL via the BASE elementを指定することができますので、

しかし、WebページのベースURLは、必ずしもあなたがから文書をフェッチURLと同じではありません。次のように必要なロジックは次のとおりです。

base_url = page_url 
head = document.getElementsByTagName('head')[0] 
for base in head.getElementsByTagName('base'): 
    if base.hasAttribute('href'): 
     base_url = urllib.parse.urljoin(base_url, base.getAttribute('href')) 
     # HTML5 4.2.3 "if there are multiple base elements with href 
     # attributes, all but the first are ignored." 
     break 

(あなたがあなたの代わりに口座にかなり毛深いXML Base specificationを取るべきしかし、あなたはおそらくそれを気にせずに逃げることができ、無以来、理論的にはその後、XHTMLを解析している場合。 1つは実際にXHTMLを使用しています。)

+0

重要な点 - ありがとう – Yarin