Ответ 1
очень просто:
>>> from urlparse import urljoin
>>> urljoin('http://mysite.com/foo/bar/x.html', '../../images/img.png')
'http://mysite.com/images/img.png'
Учитывая абсолютный 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, только требуемая логика.
очень просто:
>>> from urlparse import urljoin
>>> urljoin('http://mysite.com/foo/bar/x.html', '../../images/img.png')
'http://mysite.com/images/img.png'
Используйте 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.)