2012-03-15 29 views
17

Biorąc absolutny URL strony, a względna Link znaleźć w tę stronę, by tam być sposobem na a) ostatecznie zrekonstruować lub b) best-effort Rekonstrukc absolutny URL względnego łącza?Rekonstrukcja bezwzględnych adresów URL z względnych adresów URL na stronie

W moim przypadku odczytuję plik HTML z podanego adresu URL za pomocą pięknej zupy, usuwając wszystkie źródła znaczników img i próbując utworzyć listę bezwzględnych adresów URL do obrazów strony.

funkcja My Python dotąd wygląda następująco:

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, ? 

UWAGA: nie potrzebują odpowiedź Python, tylko logiki wymagane.

Odpowiedz

34

bardzo prosta:

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

Hej coool !! (Zgaduję, że potrzebowałem Python ..) – Yarin

+10

Moduł urlparse został przemianowany na urllib.parse w Pythonie 3. Tak więc, 'from urllib.parse import urljoin' – SparkAndShine

13

Zastosowanie urllib.parse.urljoin rozwiązać (ewentualnie względne) adresy URL URL bazowej.

Ale, bazowy adres URL strony internetowej nie musi być taka sama, jak w adresie URL pobranego z dokumentu, ponieważ strona HTML umożliwia określenie preferowanego bazowy URL via the BASE element. Logika, co potrzebne jest w następujący sposób:.

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 

(Jeśli parsowanie XHTML wtedy teoretycznie powinieneś wziąć pod uwagę zamiast raczej owłosione XML Base specification Ale prawdopodobnie można uciec bez obawy, że skoro no- jeden naprawdę używa XHTML.)

+0

Kluczowy punkt - dziękuję – Yarin

Powiązane problemy