2010-12-17 107 views
8

所以LXML有一個非常手功能:make_links_absolute:Python的BeautifulSoup相當於限於lxml make_links_absolute

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

和文檔的所有鏈接現在是絕對的。有一個簡單的等同於BeautifulSoup還是我只需要通過向裏urlparse通過它,規範它:

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

我不熟悉lxml,但URL的規範化並不那麼容易。你真的想把它們歸一化還是隻把它們變成絕對的? – 2010-12-17 08:56:25

回答

14

在我的回答對我What is a simple way to extract the list of URLs on a webpage using python?覆蓋是偶然的提取步驟的一部分;你可以很容易地寫出一種方法來做湯,而不僅僅是提取它。

import urlparse 

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

如果文檔中存在,那麼這不會失敗嗎?見例如[HTML base tag](http://www.w3schools.com/tags/tag_base.asp),由lxml處理(http://lxml.de/lxmlhtml.html) – nealmcb 2012-02-08 20:57:22

+0

當然;如果需要,可以使用'base'標記並解析它,並使用'urljoin(url,base)'而不是'url'。對於我自己而言,我幾乎沒有見過它在網絡上使用過,我永遠不會使用'base'標籤(至少不會使用'base'標籤,儘管如此,我敢說我不會使用它),因爲它在IE8中不起作用。 – 2012-02-09 11:17:31

+0

我想你的意思是'urljoin(base,tag ['href'])'。我聽說基地的使用在例如[typo3網站](http://stackoverflow.com/questions/7914922/ie9-only-sometimes-ignores-base-href),我用它,例如歸檔頁面時。我聽說[ie8 bugs](http://blogs.msdn.com/b/ieinternals/archive/2009/07/27/bugs-in-the-ie--lookahead-downloader.aspx)已被修復 - do你知道不同嗎?無論如何,我只是想澄清一下,像lxml這樣的一般工作的python方法需要什麼。 – nealmcb 2012-02-09 15:42:01