如果标签存在,beautifulsoup 从片段中获取最后一个标签
Posted
技术标签:
【中文标题】如果标签存在,beautifulsoup 从片段中获取最后一个标签【英文标题】:beautifulsoup get last tag from snippet, if tag exists 【发布时间】:2015-10-22 04:11:42 【问题描述】:这里是 html sn-p 1:
<td class="firstleft lineupopt-name" style=""><a href="/link/link_url?id=222" title="Donald Trump" target="_blank">Trump, Donald</a> <span style="color:#666;font-size:10px;">B</span> <span style="color:#cc1100;font-size:10px;font-weight:bold;">TTT</span></td>
这里是 html sn-p 2:
<td class="firstleft lineupopt-name" style=""><a href="/link/link_url2?id=221" title="Hillary Clinton" target="_blank">Clinton, Hillary</a> <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 sn-p 2,它从第一个 span 标签中获取内容。在这两种情况下,如果标签存在,我只想从最后一个 span 标签中获取内容。如何才能做到这一点?
【问题讨论】:
【参考方案1】:一种直接的方法是通过-1
index 获取最后一个元素:
ttt = all[-1].text if all else 'none'
我也尝试使用CSS selector 来处理它,但BeautifulSoup
不支持last-child
、last-of-type
或nth-last-of-type
,并且仅支持nth-of-type
伪类。
【讨论】:
【参考方案2】:我在 conda env 中使用 bs4 v4.9.1 进行了测试,现在 nth-last-of-type(1)
可以了。
【讨论】:
【参考方案3】: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> <span style="color:#666;font-size:10px;">B</span> <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> <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']
【讨论】:
以上是关于如果标签存在,beautifulsoup 从片段中获取最后一个标签的主要内容,如果未能解决你的问题,请参考以下文章
测试beautifulsoup中是不是存在children标签
在 Python 中使用 BeautifulSoup 从脚本标签中提取文本
Python/BeautifulSoup - 如何从元素中删除所有标签?
如何使用 BeautifulSoup 从 HTML 中去除评论标签?