html beautifulsoup从代码段获取最后一个标记,如果标记存在

laawzig2  于 2022-11-27  发布在  其他
关注(0)|答案(4)|浏览(194)

下面是html代码片段1:

<td class="firstleft lineupopt-name" style=""><a href="/link/link_url?id=222" title="Donald Trump" target="_blank">Trump, Donald</a>&nbsp;<span style="color:#666;font-size:10px;">B</span> &nbsp;<span style="color:#cc1100;font-size:10px;font-weight:bold;">TTT</span></td>

下面是html代码片段2:

<td class="firstleft lineupopt-name" style=""><a href="/link/link_url2?id=221" title="Hillary Clinton" target="_blank">Clinton, Hillary</a> &nbsp;<span style="color:#cc1100;font-size:10px;font-weight:bold;">TTT</span></td>

以下是我的相关代码:

all = cols[1].find_all('span')
for ele in all:
    if (ele is not None):
        ttt = cols[1].span.text
    else:
        ttt = 'none'

问题:我的代码在这两个示例中都能工作,但是对于html代码片段2,它从第一个span标签中获取内容。在这两个示例中,如果标签存在,我想只从最后一个span标签中获取内容。如何做到这一点?

mitkmikd

mitkmikd1#

BS4现在支持last-child,因此可能的方法如下:

soup.select('td span:last-child')

要获取文本,只需在结果集上迭代。

示例

from bs4 import BeautifulSoup

html='''
<td class="firstleft lineupopt-name" style=""><a href="/link/link_url?id=222" title="Donald Trump" target="_blank">Trump, Donald</a>&nbsp;<span style="color:#666;font-size:10px;">B</span> &nbsp;<span style="color:#cc1100;font-size:10px;font-weight:bold;">TTT</span></td>
<td class="firstleft lineupopt-name" style=""><a href="/link/link_url2?id=221" title="Hillary Clinton" target="_blank">Clinton, Hillary</a> &nbsp;<span style="color:#cc1100;font-size:10px;font-weight:bold;">TTT</span></td>
'''
soup = BeautifulSoup(html)

[t.text for t in soup.select('td span:last-child')]

输出

['TTT', 'TTT']
e1xvtsh3

e1xvtsh32#

一种直接的方法是通过-1索引获取最后一个元素:

ttt = all[-1].text if all else 'none'

我也尝试过使用CSS选择器来处理它,但是BeautifulSoup不支持last-childlast-of-typenth-last-of-type,并且只支持nth-of-type伪类。

mw3dktmi

mw3dktmi3#

我用bs4 v4.9.1在conda env中测试了它,现在nth-last-of-type(1)还可以。

vwkv1x7d

vwkv1x7d4#

如果您试图从已经选择的元素中只选择直接子元素,请使用:scope标签在选择器中引用它本身,这样您现在就可以使用>~+运算符。

selected_element.select_one(":scope > :last-child")

相关问题