我如何在使用BeautifulSoup的Python链接后获取文本?

时间:2013-10-23 22:32:44

标签: python beautifulsoup

我知道如何去查找所有链接,但我希望链接后立即显示文字。

例如,在给定的html中:

<p><a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;querybd=@FIELD(FLD004+@4((@1(Rep+Armey++Richard+K.))+00028))">Rep Armey, Richard K.</a> [TX-26]
 - 11/9/1999
<br/><a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;querybd=@FIELD(FLD004+@4((@1(Rep+Davis++Thomas+M.))+00274))">Rep Davis, Thomas M.</a> [VA-11]
 - 11/9/1999
<br/><a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;querybd=@FIELD(FLD004+@4((@1(Rep+DeLay++Tom))+00282))">Rep DeLay, Tom</a> [TX-22]
 - 11/9/1999

......(这反复多次)

我想提取与[CA-28] - 11/9/1999

相关联的<a href=... >Rep Dreier, David</a>

并对列表中的所有链接执行此操作

2 个答案:

答案 0 :(得分:5)

可能有一种更漂亮的方式,但我通常链.next

>>> soup.find_all("a")
[<a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;querybd=@FIELD(FLD004+@4((@1(Rep+Armey++Richard+K.))+00028))">Rep Armey, Richard K.</a>, <a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;querybd=@FIELD(FLD004+@4((@1(Rep+Davis++Thomas+M.))+00274))">Rep Davis, Thomas M.</a>, <a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;querybd=@FIELD(FLD004+@4((@1(Rep+DeLay++Tom))+00282))">Rep DeLay, Tom</a>]
>>> [a.next for a in soup.find_all("a")]
[u'Rep Armey, Richard K.', u'Rep Davis, Thomas M.', u'Rep DeLay, Tom']
>>> [a.next.next for a in soup.find_all("a")]
[u' [TX-26]\n - 11/9/1999\n', u' [VA-11]\n - 11/9/1999\n', u' [TX-22]\n - 11/9/1999']
>>> {a.next: a.next.next for a in soup.find_all("a")}
{u'Rep Davis, Thomas M.': u' [VA-11]\n - 11/9/1999\n', u'Rep DeLay, Tom': u' [TX-22]\n - 11/9/1999', u'Rep Armey, Richard K.': u' [TX-26]\n - 11/9/1999\n'}

答案 1 :(得分:3)

findNextSibling是一种强大而灵活的方式。

设置

使用此设置。

from BeautifulSoup import BeautifulSoup
from pprint import pprint

markup = '''
<p><a href="/cgi-bin/...00028))">Rep Armey, Richard K.</a> [TX-26]
 - 11/9/1999
<br/><a href="/cgi-bin/...00274))">Rep Davis, Thomas M.</a> [VA-11]
 - 11/9/1999
<br/><a href="/cgi-bin/...00282))">Rep DeLay, Tom</a> [TX-22]
 - 11/9/1999
 '''

soup = BeautifulSoup(markup)

我们在这里做什么:

  • 导入BeautifulSoup啜饮汤
  • 导入pprint以使用漂亮打印检查中间结果
  • 将样本标记(带有hrefs截断)粘贴到变量
  • 啜饮标记,以便我们可以粉碎它

为了清楚起见,href被截断。结果与原始样本相同。

查找所有链接

使用'a'调用findAll:

links = soup.findAll('a')
pprint(links)

pprint显示每个链接的标记。

[<a href="/cgi-bin/...00028))">Rep Armey, Richard K.</a>,
 <a href="/cgi-bin/...00274))">Rep Davis, Thomas M.</a>,
 <a href="/cgi-bin/...00282))">Rep DeLay, Tom</a>]

获取元素后面的文字

使用text = True调用findNextSibling。

text_0 = links[0].findNextSibling(text=True)
pprint(text_0)

pprint显示第一个链接后面的文字,换行符编码为\n

u' [TX-26]\n - 11/9/1999\n'

为所有链接执行

在列表推导中使用findNextSibling来获取每个链接后的文本。

next_text = [ln.findNextSibling(text=True) for ln in links]
pprint(next_text)

pprint显示文本列表,标记中每个链接一个项目。

[u' [TX-26]\n - 11/9/1999\n',
 u' [VA-11]\n - 11/9/1999\n',
 u' [TX-22]\n - 11/9/1999\n ']