Python BeautifulSoup select div class

Viewed 1103

I am scraping an HTML like this

<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>

I am using this

soup_object.find_all("div", {"class": "col-xs-12"})

I want only a div with a class "col-16", but it is returning all the divs.

How can I select only a div class with "col-16"?

Edit

I want to get this

<div class="col-16"> ... </div>
<div class="col-16"> ... </div>

But I am getting this

<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
2 Answers

Just filter the divs by number of class attributes.

For example:

from bs4 import BeautifulSoup

if __name__ == '__main__':
    sample_html = """<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>"""
    soup = BeautifulSoup(sample_html, "html.parser").find_all("div")
    filtered = [div for div in soup if len(div.attrs["class"]) == 1]
    print(filtered)

Output:

[<div class="col-16"> ... </div>, <div class="col-16"> ... </div>]

I think these would help:

BeautifulSoup webscraping find_all( ): finding exact match

https://medium.com/@epicshane/using-beautifulsoup4-to-find-class-exact-match-3e263a95e330

I have tried the solution from: https://stackoverflow.com/a/22735249/13548379

from bs4 import BeautifulSoup

html_doc = """<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
"""

soup = BeautifulSoup(html_doc, 'html.parser')
#print(soup.prettify())
item = soup.find_all(lambda tag: tag.name == 'div' and 
                                   tag.get('class') == ['col-16'])
for x in item:
    print(x.prettify())

And the result is:

<div class="col-16">
 ...
</div>

<div class="col-16">
 ...
</div>
Related