Подтвердить что ты не робот

Реконструкция абсолютных URL-адресов от относительных URL-адресов на странице

Учитывая абсолютный URL-адрес страницы и относительную ссылку, найденную на этой странице, будет ли способ a) окончательно восстановить или b) наилучшим образом восстановить абсолютный URL-адрес относительной ссылки?

В моем случае я читаю html файл с данного URL-адреса, используя красивый суп, удаляя все источники тегов img и пытаясь составить список абсолютных URL-адресов для изображений страниц.

Моя функция Python выглядит так:

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 an absolute URL, do nothing.
        pass
    elif src.find('/') == 0:
        # If it a root URL, append it to the base URL:
        src = 'http://' + url_base + src
    else:
        # If it a relative URL, ?

ПРИМЕЧАНИЕ.. Не нужно отвечать на Python, только требуемая логика.

4b9b3361

Ответ 1

очень просто:

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

Ответ 2

Используйте urllib.parse.urljoin, чтобы разрешить (возможно относительный) URL-адрес по отношению к базовому URL-адресу.

Но базовый URL-адрес веб-страницы не обязательно совпадает с URL-адресом, из которого вы извлекли документ, потому что HTML позволяет странице указать свой предпочтительный базовый URL через элемент BASE. Необходимая логика такова:

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