[英]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.