2010-12-17 32 views
8

Yani Lxml çok eli özelliği vardır LXML içinPython BeautifulSoup eşdeğer make_links_absolute

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

ve dokümanın tüm bağlantıları artık mutlak vardır. BeautifulSoup kolay bir eşdeğer var mı yoksa sadece urlparse içinde geçirilmekte ve onu normalleştirmek gerekiyor:

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

Ben lxml aşina değilim, ancak URL normalleştirme çok kolay değil. Onları normalleştirmek mi yoksa sadece onları mutlaklaştırmak mı istiyorsunuz? –

cevap

14

cevabım ise What is a simple way to extract the list of URLs on a webpage using python? I kaplı olduğunu tesadüfen çıkarma adımın bir parçası olarak; Çorbada yapmak için basit bir yöntem yazabilir ve sadece ayıklamakla kalmazsınız.

import urlparse 

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

Belgedeki varsa bu başarısız olmaz mı? Bakınız örn. Lxml (http://lxml.de/lxmlhtml.html) tarafından işlenen [HTML temel etiketi] (http://www.w3schools.com/tags/tag_base.asp) – nealmcb

+0

Elbette; İstediğiniz ve ayrıştırırsanız 'base' etiketini alabilir ve 'url' yerine 'urljoin (url, base)' kullanabilirsiniz. Kendim için, web üzerinde hiç kullanılmadığını gördüm ve "base" etiketini asla kullanmam (en azından birkaç yıl boyunca değil, daha sonra da bunun için kullanacağım söylemeye cesaret edemiyorum) IE8'de çalışmıyor. –

+0

Sanırım urljoin (taban, tag ['href']) 'demek istiyorsunuz. Baz kullanımının ör. [typo3 siteleri] (http://stackoverflow.com/questions/7914922/ie9-only-sometimes-ignores-base-href) ve kullanıyorum. sayfaları arşivlerken. [Ie8 hataları] 'nın (http://blogs.msdn.com/b/ieinternals/archive/2009/07/27/bugs-in-the-ie8-lookahead-downloader.aspx) düzeltildiğini duydum - farklı biliyor musun? Her halükarda, genel olarak lxml gibi çalışan bir python yöntemine sahip olmak için gerekenleri açıklığa kavuşturmak istedim. – nealmcb