BeautifulSoup вопрос - PullRequest
       3

BeautifulSoup вопрос

0 голосов
/ 13 декабря 2010
<parent1>
    <span>Text1</span>
</parnet1>
<parent2>
    <span>Text2</span>
</parnet2>
<parent3>
    <span>Text3</span>
</parnet3>

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

Ответы [ 3 ]

1 голос
/ 13 декабря 2010

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

[e for e in soup(recursive=False, text=False) if e.span.string == 'Text2']
1 голос
/ 13 декабря 2010

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

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

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

0 голосов
/ 12 мая 2015

Используя 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...