2013-10-23 37 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

相關問題