python - rutas - Reconstrucción de las URL absolutas a partir de las URL relativas en una página
rutas relativas php (2)
Use urllib.parse.urljoin
para resolver una URL (posiblemente relativa) contra una URL base.
Sin embargo , la URL base de una página web no es necesariamente la misma que la URL de la que obtuvo el documento, ya que HTML permite que una página especifique su URL base preferida a través del elemento BASE
. La lógica que necesitas es la siguiente:
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
(Si estás analizando XHTML, en teoría deberías tener en cuenta la especificación XML Base, que es bastante peluda. Pero probablemente puedas escapar sin preocuparte por eso, ya que nadie realmente usa XHTML).
Dada una url absoluta de una página y un enlace relativo encontrado dentro de esa página, ¿habría una manera de a ) reconstruir definitivamente o b) reconstruir con el mejor esfuerzo la url absoluta del enlace relativo?
En mi caso, estoy leyendo un archivo html de una url determinada usando una sopa hermosa, eliminando todas las fuentes de etiquetas img y tratando de construir una lista de urls absolutas para las imágenes de la página.
Mi función de Python hasta ahora se parece a:
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, ?
NOTA: No necesita una respuesta de Python, solo la lógica requerida.
muy simple:
>>> from urlparse import urljoin
>>> urljoin(''http://mysite.com/foo/bar/x.html'', ''../../images/img.png'')
''http://mysite.com/images/img.png''