Можно ли просто получить теги без класса или идентификатора с BeautifulSoup? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть несколько тысяч HTML-сайтов, и я пытаюсь отфильтровать текст с этих сайтов.

Я делаю это с красивым супом. get_text() дает мне много ненужной информации с этих сайтов.

Поэтому я написал цикл:

l = []
for line in text5:                   
    soup = bs(line, 'html.parser')
    p_text = ' '.join(p.text for p in soup.find_all('p'))  
    k = p_text.replace('\n', '')
    l.append(k)

Но этот цикл дает мне все, что было в теге, начинающемся с <p.

Например:

Я хочу все между двумя простыми тегами <p>. Но я также получаю контент от чего-то вроде этого:

<p class="header-main__label"> bla ba </p>.

Могу ли я сказать BeautifulSoup просто получить простые <p> теги?

1 Ответ

2 голосов
/ 07 ноября 2019

Вы можете установить False для class и id, и он получит теги без class и id

soup.find_all('p', {'class': False, 'id': False})

или (слово class_ имеет _, потому чтов Python есть ключевое слово class

soup.find_all('p', class_=False, id=False)

from bs4 import BeautifulSoup as BS

text = '<p class="A">text A</p>  <p>text B</p>  <p id="C">text C</p>'

soup = BS(text, 'html.parser')

# ----

all_items = soup.find_all('p', {'class': False, 'id': False})

for item in all_items:
    print(item.text)

# ---

all_items = soup.find_all('p', class_=False, id=False)

for item in all_items:
    print(item.text)

РЕДАКТИРОВАТЬ: Если вы хотите теги без каких-либо атрибутов, вы можете фильтровать элементы, используя not item.attrs

for item in all_items:
    if not item.attrs:
        print(item.text)

from bs4 import BeautifulSoup as BS

text = '<p class="A">text A</p> <p>text B</p> <p id="C">text C</p> <p data="D">text D</p>'

soup = BS(text, 'html.parser')

all_items = soup.find_all('p')

for item in all_items:
    if not item.attrs:
        print(item.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...