簡體   English   中英

如何一次通過標簽或類查找多個元素

[英]How to find multiple elements by tag or class at once

有沒有辦法一次 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'])

有沒有辦法做到這一點?

謝謝

如果您有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>]

你可以試試:


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>]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM