【问题标题】:How to find multiple elements by tag or class at once如何一次按标签或类查找多个元素
【发布时间】:2020-01-22 10:40:14
【问题描述】:

有没有办法一次性找到带有条件列表的所有标签?

例如,在这个 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'])

有办法吗?

谢谢

【问题讨论】:

    标签: html python-3.x web-scraping beautifulsoup


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你可以试试:

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

      【讨论】:

        猜你喜欢
        • 2021-06-16
        • 1970-01-01
        • 2011-04-09
        • 2011-06-29
        • 1970-01-01
        • 2020-01-08
        相关资源
        最近更新 更多