从html中提取href

时间:2014-06-24 14:37:43

标签: python html beautifulsoup

我获得以下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 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

为什么不使用split命令?

迭代文件的所有行并进行类似的操作:

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