我知道如何去查找所有链接,但我希望链接后立即显示文字。
例如,在给定的html中:
<p><a href="/cgi-bin/bdquery/?&Db=d106&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/?&Db=d106&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/?&Db=d106&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>
并对列表中的所有链接执行此操作
答案 0 :(得分:5)
可能有一种更漂亮的方式,但我通常链.next
:
>>> soup.find_all("a")
[<a href="/cgi-bin/bdquery/?&Db=d106&querybd=@FIELD(FLD004+@4((@1(Rep+Armey++Richard+K.))+00028))">Rep Armey, Richard K.</a>, <a href="/cgi-bin/bdquery/?&Db=d106&querybd=@FIELD(FLD004+@4((@1(Rep+Davis++Thomas+M.))+00274))">Rep Davis, Thomas M.</a>, <a href="/cgi-bin/bdquery/?&Db=d106&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)
我们在这里做什么:
为了清楚起见,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 ']