Множество условий в BeautifulSoup: Text= True

#python #selenium #beautifulsoup

#python #selenium #beautifulsoup

Вопрос:

есть ли способ использовать несколько условий в BeautifulSoup?

Это два условия, которые я хотел бы использовать вместе:

Получить текст:

 soup.find_all(text=True)
  

Получаем img alt:

 soup.find_all('img', title=True):
  

Я знаю, что могу сделать это отдельно, но я хотел бы собрать все вместе, чтобы сохранить поток HTML.

Причина, по которой я это делаю, заключается в том, что только BeautifulSoup извлекает скрытый текст с помощью css: Display None.

При использовании driver.find_element_by_tag_name(‘body’).text вы получаете значение alt в формате img, но, к сожалению, не скрытый текст с помощью css: display:none.

Я ценю вашу помощь. Спасибо!

Ответ №1:

.find_all() возвращает только тексты или теги, но вы можете создать свою собственную функцию, которая возвращает тексты из супа и текст из alt= атрибутов.

Например:

 from bs4 import BeautifulSoup, Tag, NavigableString


txt = '''
Some text
<img alt="Some alt" src="#" />
Some other text
'''

def traverse(s):
    for c in s.contents:
        if isinstance(c, Tag):
            if c.name == 'img' and 'alt' in c.attrs:
                yield c['alt']
            yield from traverse(c)
        elif isinstance(c, NavigableString):
            yield c


soup = BeautifulSoup(txt, 'html.parser')

for text in traverse(soup):
    print(text.strip())
  

С принтами:

 Some text
Some alt
Some other text
  

Комментарии:

1. Это работает как шарм, братан, спасибо! У меня вопрос, в чем разница использовать «выход из traverse (c)» или «выход из c». Я думаю, что оба имеют одинаковый результат, но мне любопытно, зачем использовать одну и ту же функцию… Я бы никогда не подумал.

2. Есть ли способ сохранить результаты в строковой переменной?

3. Понял, просто создал переменную str внутри цикла for и готово! Спасибо!