我获得以下html:
<A HREF="Acaryochloris_marina_MBIC11017_uid58167/"><IMG border="0" SRC="SOMETHING" ALT="[DIR] "></A> <A HREF="Acaryochloris_marina_MBIC11017_uid58167/">Acaryochloris_marina_MBIC11017_></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></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
答案 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]