BeautifulSoup вопрос

<parent1>
    <span>Text1</span>
</parnet1>
<parent2>
    <span>Text2</span>
</parnet2>
<parent3>
    <span>Text3</span>
</parnet3>

Я анализирую это с помощью Python и BeautifulSoup. У меня есть переменная soupData, в которой хранится указатель на необходимый объект. Как я могу получить указатель на parent2, например, если у меня есть текст Text2. Итак, проблема заключается в фильтрации тегов span по содержимому. Как я могу это сделать?


person Max Frai    schedule 13.12.2010    source источник


Ответы (3)


После исправления орфографии на конечных тегах:

[e for e in soup(recursive=False, text=False) if e.span.string == 'Text2']
person Marcelo Cantos    schedule 13.12.2010

Я не думаю, что есть способ сделать это за один шаг. Так:

for parenttag in soupData:
    if parenttag.span.string == "Text2":
        do_stuff(parenttag)
        break

Можно использовать генераторное выражение, но не намного короче.

person Thomas K    schedule 13.12.2010

Используя python 2.7.6 и BeautifulSoup 4.3.2, я обнаружил, что ответ Марсело дает пустой список. Однако это сработало для меня:

[x.parent for x in bSoup.findAll('span') if x.text == 'Text2'][0]

В качестве альтернативы, для смехотворно перегруженного решения (по крайней мере, для этой конкретной проблемы, но, возможно, это было бы полезно, если вы будете выполнять фильтрацию по критериям слишком долго, чтобы ввести достаточно легко понятное выражение списка), вы могли бы сделать:

def hasText(text):
    def hasTextFunc(x):
        return x.text == text
    return hasTextFunc

чтобы создать фабрику функций, затем

hasTextText2 = hasText('Text2')

filter(hasTextText2,bSoup.findAll('span'))[0].parent

чтобы получить ссылку на родительский тег, который вы искали

person Blair    schedule 12.05.2015