2014-06-24 78 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