Сочетание «найти» с функцией в Beaitufulsoup - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь получить список тегов, которые, CTC_3D_Printer, ctc_prusa_i3_pro_b, CTC_Upgrades из следующего HTML-кода источника

 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">.Как я мог решить мою проблему, комбинируя «поиск» с какой-то предопределенной функцией?

1 Ответ

0 голосов
/ 05 июня 2018

Как объяснено в Виды фильтров в документах, вы просто пишете функцию (которая принимает объект тега BS и возвращает true, если это совпадение) и передаете ее в find.

Их пример - это функция, которая находит только теги с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...