结合"找到"功能于Beaitufulsoup

时间:2018-06-04 20:52:30

标签: python beautifulsoup

我正在尝试从以下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;来解决我的问题?有一些预定义的功能?

1 个答案:

答案 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)