2010-12-17 14 views
8

Więc lxml posiada funkcję bardzo rąk: make_links_absolute:Python BeautifulSoup równoważne lxml make_links_absolute

doc = lxml.html.fromstring(some_html_page) 
doc.make_links_absolute(url_for_some_html_page) 

i wszystkie linki w dokumencie są absolutne teraz. Czy istnieje prosty odpowiednik w BeautifulSoup czy mogę po prostu trzeba przekazać go przez urlparse i znormalizować go:

soup = BeautifulSoup(some_html_page) 
for tag in soup.findAll('a', href=True): 
    url_data = urlparse(tag['href']) 
    if url_data[0] == "": 
     full_url = url_for_some_html_page + test_url 
+0

Nie jestem zaznajomiony z lxml, ale normalizacja adresu URL nie jest tak łatwa. Czy naprawdę chcesz je znormalizować, czy tylko uczynić je absolutnymi? –

Odpowiedz

14

W mojej odpowiedzi do What is a simple way to extract the list of URLs on a webpage using python? przejechałem które notabene jako część etapu ekstrakcji; można łatwo napisać metodę, aby zrobić to na zupie, a nie tylko ją wyodrębnić.

import urlparse 

def make_links_absolute(soup, url): 
    for tag in soup.findAll('a', href=True): 
     tag['href'] = urlparse.urljoin(url, tag['href']) 
+1

Czy to nie zawiedzie, jeśli w dokumencie istnieje ? Zobacz np. [Znacznik HTML HTML] (http://www.w3schools.com/tags/tag_base.asp), który jest obsługiwany przez lxml (http://lxml.de/lxmlhtml.html) – nealmcb

+0

Sure; możesz wziąć znacznik 'base', jeśli chcesz i parsować go i użyć' urljoin (url, base) 'zamiast' url'. Dla mnie prawie nigdy nie widziałem, aby był używany w sieci i nigdy nie użyję tagu 'base' (najmniej sposobów, nie przez wiele lat, choć nawet wtedy ośmielę się powiedzieć, że nie będę miał z tego pożytku), ponieważ to nie działa w IE8. –

+0

Myślę, że masz na myśli 'urljoin (base, tag ['href'])'. Słyszałem, że użycie bazy jest powszechne w np. [strony typo3] (http://stackoverflow.com/questions/7914922/ie9-only-sometimes-ignores-base-ref) i użyłem go np. podczas archiwizowania stron. Słyszałem, że zostały naprawione [ie8 bugi] (http://blogs.msdn.com/b/ieinternals/archive/2009/07/27/bugs-in-the-ie8-lookahead-downloader.aspx) - wiesz inaczej? W każdym razie, chciałem tylko wyjaśnić, co to jest, aby mieć metodę python, która działa w ogóle jak w przypadku lxml. – nealmcb