Восстановление абсолютных URL-адресов из относительных URL-адресов на странице - PullRequest
21 голосов
/ 15 марта 2012

Учитывая абсолютный 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: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, только требуется логика.

Ответы [ 2 ]

40 голосов
/ 15 марта 2012

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

>>> from urlparse import urljoin
>>> urljoin('http://mysite.com/foo/bar/x.html', '../../images/img.png')
'http://mysite.com/images/img.png'
16 голосов
/ 15 марта 2012

Используйте 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.)

...