25

ページの絶対 URL とそのページ内にある相対リンクが与えられた場合、 a )決定的に再構築するか、b)相対リンクの絶対 URL を最善の努力で再構築する方法はありますか?

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

これまでの私の Python 関数は次のようになります。

function get_image_url(page_url,image_src):

    from urlparse import urlparse
    # parsed = urlparse('http://user:pass@NetLoc: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 の回答は必要ありません。必要なのはロジックだけです。

4

2 に答える 2

43

非常に単純です:

>>> from urlparse import urljoin
>>> urljoin('http://mysite.com/foo/bar/x.html', '../../images/img.png')
'http://mysite.com/images/img.png'
于 2012-03-15T11:21:41.543 に答える
19

urllib.parse.urljoinベース URL に対して (おそらく相対) URL を解決するために使用します。

ただし、Web ページのベース URL は、ドキュメントを取得した URL と必ずしも同じではありません。これは、HTML ではページが要素を介してBASE優先ベース 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

(XHTML を構文解析している場合、理論的には代わりにやや複雑な XML Base 仕様を考慮する必要があります。しかし、XHTML を実際に使用する人はいないため、おそらくそれについて心配する必要はありません。)

于 2012-03-15T11:59:34.590 に答える