#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 и готово! Спасибо!