2013-10-23 84 views
0

我知道如何去找到所有的链接,但我希望链接后立即获得文本。如何获得与BeautifulSoup的Python链接后的文本?

例如,在给定的HTML:

<p><a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;[email protected]([email protected]((@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;[email protected]([email protected]((@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;[email protected]([email protected]((@1(Rep+DeLay++Tom))+00282))">Rep DeLay, Tom</a> [TX-22] 
- 11/9/1999 

...(这个重复的次数)

我想提取与<a href=... >Rep Dreier, David</a>

和相关的[CA-28] - 11/9/1999对列表中的所有链接执行此操作

+0

[findNextSibling](http://stackoverflow.com/a/14062965/111424)?无法在我的网站上安装BeautifulSoup来测试它。 –

回答

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检查中间结果用漂亮的印刷
  • 粘贴样品标记(用的HREF截断)成一个变量
  • 唾弃标记,所以我们可以把它粉碎它

为清晰起见,hrefs被截断。原始样本的结果是相同的。

找到所有的链接以 ''

呼叫的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>] 

获取元素

与文本呼叫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 '] 
5

可能有更漂亮的方法,但我通常会链.next

>>> soup.find_all("a") 
[<a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;[email protected]([email protected]((@1(Rep+Armey++Richard+K.))+00028))">Rep Armey, Richard K.</a>, <a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;[email protected]([email protected]((@1(Rep+Davis++Thomas+M.))+00274))">Rep Davis, Thomas M.</a>, <a href="/cgi-bin/bdquery/?&amp;Db=d106&amp;[email protected]([email protected]((@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'} 

+0

我最终与Iain Elder的回答一起去了。 'findNextSibling'帮助我完成了其他一些我需要做的事情,但这也非常有帮助。谢谢。 –

+0

@andymcevoy:不用担心!通常情况下,某人(在这种情况下是我!)发布一个较低级别的方法,然后其他人提供更有用的答案。 – DSM

相关问题