BeautifulSoup: найдите любой тег, который соответствует одному тегу по имени или другому тегу по атрибуту - PullRequest
1 голос
/ 09 января 2020

Я хочу найти все теги, которые <h1> ИЛИ <div class='abc'>. Я пытался bs.find_all(['h1', 'div'], attrs={'class': 'abc'}), но это будет игнорировать теги <h1>: очевидно, аргумент attrs применяет условие И к поиску (то есть тег должен принадлежать списку имени тега И иметь заданный атрибут, который <h1> теги не встречаются).

Кто-нибудь может предложить исправить это? Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 января 2020

Может быть, вы можете использовать выберите .

from bs4 import BeautifulSoup as bs
from io import StringIO

data = """<html>
<body>
<h1>Test 1</h1>
<h2>Test 2</h2>
<div class='abc'><p>Test 3</p></div>
</body>
</html>"""

soup = bs(StringIO(data), 'html.parser')
print(soup.select('h1,div[class="abc"]'))
print(soup.find_all(['h1', 'div'], attrs={'class' : 'abc'}))

выход

[<h1>Test 1</h1>, <div class="abc"><p>Test 3</p></div>]
[<div class="abc"><p>Test 3</p></div>]
0 голосов
/ 09 января 2020

Как насчет объединения двух результатов, таких как bs.find_all('h1') + bs.find_all(['div', attrs={'class': 'abc'})?

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