2014-06-24 109 views
0

我給下面的HTML:提取HREF從HTML

<A HREF="Acaryochloris_marina_MBIC11017_uid58167/"><IMG border="0" SRC="SOMETHING" ALT="[DIR] "></A> <A HREF="Acaryochloris_marina_MBIC11017_uid58167/">Acaryochloris_marina_MBIC11017_&gt;</A> Jun 12 2013   
<A HREF="Acetobacter_pasteurianus_386B_uid214433/"><IMG border="0" SRC="SOMETHING" ALT="[DIR] "></A> <A HREF="Acetobacter_pasteurianus_386B_uid214433/">Acetobacter_pasteurianus_386B_u&gt;</A> Aug 8 2013 

還有更多... 我想從這裏提取HREF。

這裏是我的Python腳本:(page_source包含HTML)

soup = BeautifulSoup(page_source) 

links = soup.find_all('a',attrs={'href': re.compile("^http://")}) 

for tag in links: 
    link = tag.get('href',None) 
    if link != None: 
     print link 

但是,這可防止返回以下錯誤:

links = soup.find_all('A',attrs={'HREF': re.compile("^http://")}) 
TypeError: 'NoneType' object is not callable 

回答

2

您使用BeautifulSoup 3版,而不是第4版。 soup.find_all然後不被解釋爲方法,而是作爲搜索第一個<find_all>元素。因爲沒有這樣的元素,所以soup.find_all解析爲None

安裝BeautifulSoup 4代替,進口是:

from bs4 import BeautifulSoup 

BeautifulSoup 3代替導入爲from BeautifulSoup import BeautifulSoup

如果你確定你想使用BeautifulSoup 3(推薦),然後使用:

links = soup.findAll('a', attrs={'href': re.compile("^http://")}) 

作爲一個側面說明,因爲你將搜索範圍限制<a>標籤具有一定的價值,*對於找到的元素總是會有一個href屬性。使用.get()和測試None是完全多餘的。以下是等價的:

links = soup.find_all('a',attrs={'href': re.compile("^http://")}) 

for tag in links: 
    link = tag['href'] 
    print link 

BeautifulSoup 4還支持CSS selectors,這可能使您的查詢稍微更具可讀性的是,不再需要爲你指定一個正則表達式:

for tag in soup.select('a[href^=http://]'): 
    link = tag['href'] 
    print link 
+0

我做的findAll,腳本運行,但沒有輸出打印在控制檯.. – user3739969

+0

嘿,我剛剛工作了。非常感謝! – user3739969

-1

爲什麼不使用分裂命令?

迭代的文件和d類似的東西都行:

href = line.split("HREF=\"")[1].split("\"")[0] 
+0

不,因爲HTML很少像所有那樣簡單和規則。使用HTML解析器是正確的解決方法。只要您使用實際實現支持的方法。 –

+0

假設所有屬性及其值必須位於同一行。 – MxyL