Как найти несколько элементов по тегу или классу одновременно - PullRequest
2 голосов
/ 22 января 2020

Есть ли способ найти теги find_all сразу со списком условий?

Например, в этом HTML я хотел бы извлечь теги <p> и <div data-type="b">.

HTML

<div>
    <h1>Chapter 1</h1>
        <p>aaa</p>
        <p>aaa</p>
        <p>aaa</p>
    <div>
        <h1>Section 1</h1>
        <p>bbb</p>
        <p>bbb</p>
        <p>bbb</p>
    </div>
    <div data-type="a">...</div>
    <div data-type="a">...</div>
    <div data-type="b">...</div>
    ...
</div>

Желаемый результат

<p>aaa</p>
<p>aaa</p>
<p>aaa</p>
<p>bbb</p>
<p>bbb</p>
<p>bbb</p>
<div data-type="a">...</div>
<div data-type="a">...</div>

Конечно, я мог бы сделать:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
p_tags = soup.find_all('p')
div_tags = soup.find_all('div', {"data-type": "a"})

Но я бы хотел сделать что-то вроде:

p_and_div_tags = soup.find_all(['p', 'div_tag_with_attribute'])

Есть ли способ сделать это?

Спасибо

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Если у вас BS4 4.7.1 или выше, вы можете использовать селектор css.

Код :

from bs4 import BeautifulSoup
html='''<div>
    <h1>Chapter 1</h1>
        <p>aaa</p>
        <p>aaa</p>
        <p>aaa</p>
    <div>
        <h1>Section 1</h1>
        <p>bbb</p>
        <p>bbb</p>
        <p>bbb</p>
    </div>
    <div data-type="a">...</div>
    <div data-type="a">...</div>
    <div data-type="b">...</div>
    ...
</div>'''

soup=BeautifulSoup(html,'html.parser')
items=soup.select('p,div[data-type="a"]')
print(items)

Вывод :

[<p>aaa</p>, <p>aaa</p>, <p>aaa</p>, <p>bbb</p>, <p>bbb</p>, <p>bbb</p>, <div data-type="a">...</div>, <div data-type="a">...</div>]
1 голос
/ 22 января 2020

Вы можете попробовать:


def func(tag):
    return 'div' in tag.name and tag.has_attr('data-type')

soup.find_all(['p', func])


вывод

[<p>aaa</p>,
 <p>aaa</p>,
 <p>aaa</p>,
 <p>bbb</p>,
 <p>bbb</p>,
 <p>bbb</p>,
 <div data-type="a">...</div>,
 <div data-type="a">...</div>,
 <div data-type="b">...</div>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...