我正在尝试从以下html源代码中获取CTC_3D_Printer,ctc_prusa_i3_pro_b,CTC_Upgrades标签的列表
html = """
<div class="content_stack">
<h2 class="section-header justify">
Tags
</h2>
<div class="thing-detail-tags-container">
<div class="taglist">
<a href="/tag:CTC_3D_Printer">CTC_3D_Printer</a>
<a href="/tag:ctc_prusa_i3_pro_b">ctc_prusa_i3_pro_b</a>
<a href="/tag:CTC_Upgrades">CTC_Upgrades</a>
</div>
</div>
</div>
<div class="content_stack">
<h2 class="section-header">
Design Tools
</h2>
<div class="taglist">
<span>Tinkercad</span>
</div>
</div>
"""
通常我会使用:
tags = soup.find("h2", string = "Tags").findNextSibling()
获取标签。但是由于标签周围有额外的空间,我无法使用它。标签并不总是<div class="content_stack">
之后的第一个元素。我如何通过结合&#34; find&#34;来解决我的问题?有一些预定义的功能?
答案 0 :(得分:2)
正如文档中Kinds of filters中所解释的那样,您只需编写一个函数(它接受一个BS标记对象,如果它匹配则返回true),并将其传递给find
。 / p>
他们的示例是一个只找到class
但没有id
的标签的函数:
def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
对于您的情况,您只想对文本进行in
检查:
h2 = soup.find('h2', string=lambda s: 'Tags' in s)
......或者可能:
h2 = soup.find(lambda tag: tag.name=='h2' and 'Tags' in tag.string)