【问题标题】:How would I get the text AFTER a link in Python with BeautifulSoup?在 Python 中使用 BeautifulSoup 链接后如何获取文本?
【发布时间】:2013-10-23 22:32:43
【问题描述】:

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

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

...(重复多次)

我想提取与&lt;a href=... &gt;Rep Dreier, David&lt;/a&gt;关联的[CA-28] - 11/9/1999

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

【问题讨论】:

  • findNextSibling?无法在我的站点上安装 BeautifulSoup 进行测试。

标签: python beautifulsoup


【解决方案1】:

可能有更漂亮的方式,不过我一般是链.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'}

等等

【讨论】:

  • 我最终选择了 Iain Elder 的回答。 findNextSibling 帮助我做了一些其他我需要做的事情,但这也很有帮助。谢谢。
  • @andymcevoy:不用担心!通常情况下,有人(在这种情况下是我!)发布了一个有效的较低级别的方法,然后其他人给出了更有用的答案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-09
    • 2020-05-19
    • 2013-12-17
    • 2015-01-03
    • 2015-09-11
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    相关资源
    最近更新 更多