Получить все теги, кроме списка тегов BeautifulSoup - PullRequest
0 голосов
/ 17 июня 2019

Мне нужно извлечь текст с веб-сайта с границей текста, т.е. заключенной в тег.

Я хочу отфильтровать все нежелательные теги, такие как

'style', 'script', 'head', 'title', 'meta', '[document]'

, и получить текст изостальные теги

Например:

HTML

<script>console.log('hello');</script>
<span>Header</span>
<p>Some paragraph</p>

ВЫХОД

['Header', 'Some paragraph']

Я знаю, что могу сделать

soup.findall('span', text=True) 

и т. Д. Для p и других тегов, содержащих текст

Это неэффективно, и поэтому мне нужна альтернатива для фильтрациивсе ненужные элементы, а затем получить текст.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Если вы используете последнюю версию BeautifulSoup (я использую beautifulsoup4==4.7.1), вы можете использовать CSS :not селектор ( doc ):

from bs4 import BeautifulSoup

data = '''
<script>console.log('hello');</script>
<span>Header</span>
<document>This is document</document>
<p>Some paragraph</p>
'''

soup = BeautifulSoup(data, 'lxml')

l = [tag.text for tag in soup.body.select(':not(style, script, head, title, meta, document)')]
print(l)

Печать:

['Header', 'Some paragraph']
1 голос
/ 17 июня 2019

Сначала вы можете удалить все ненужные теги с вашего супового объекта, например:

КОД:

from bs4 import BeautifulSoup as bs

html = """<script>console.log('hello');</script>
<span>Header</span>
<p>Some paragraph</p>
"""
tags = ['style', 'script', 'head', 'title', 'meta', '[document]']
soup = bs(html, 'html.parser')

for t in tags:
    [s.extract() for s in soup(t)]

for el in soup.find_all():
    print(el.text)

ВЫВОД:

Header
Some paragraph

Затем вы можете увидеть, что теги script исчезли, и вы можете работать с суповым объектом как хотите

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