2012-03-15 19 views
17

indicado una dirección URL absoluta de una página, y un vínculo relativo encontrado dentro de esa página, ¿habría una manera de a) reconstruir definitivamente o b) de mejor esfuerzo de reconstrucción la url absoluta del enlace relativo?la reconstrucción de las direcciones URL absolutas de URLs relativas en una página

En mi caso, estoy leyendo un archivo html de una url determinada utilizando sopa hermosa, eliminando todas las fuentes de etiqueta img y tratando de construir una lista de direcciones URL absolutas para las imágenes de la página.

función Mi Python se ve tan lejos como:

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'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 necesite una respuesta Python, sólo la lógica requerida.

Respuesta

34

muy simple:

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

Hey coool !! (Supongo que sí necesitaba Python ...) – Yarin

+10

El módulo urlparse se renombra a urllib.parse en Python 3. Por lo tanto, 'from urllib.parse import urljoin' – SparkAndShine

13

Uso urllib.parse.urljoin para resolver una dirección URL (posiblemente relativa) contra una URL base.

Pero, la URL base de una página web no es necesariamente la misma que la dirección URL para el que obtuvo el documento, ya que permite que una página HTML para especificar la URL base preferida via the BASE element. La lógica que necesita 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á analizando XHTML entonces, en teoría, usted debe tomar en cuenta el lugar peluda XML Base specification lugar, pero es probable que pueda salir de allí sin preocuparse de que, desde no- uno realmente usa XHTML.)

+0

Un punto crucial- Gracias – Yarin

Cuestiones relacionadas