1

我知道如何去寻找所有的链接,但我想要链接后的文本。

例如,在给定的 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>

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

4

2 回答 2

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'}

等等

于 2013-10-23T22:38:19.553 回答
4

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 被截断)粘贴到变量中
  • 啜食标记,这样我们就可以切碎它

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

找到所有链接

用 '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 ']
于 2013-10-23T23:59:13.313 回答