Beautiful Soup - Find Elements by Class



CSS (cascaded Style sheets) is a tool for designing the appearance of HTML elements. CSS rules control the different aspects of HTML element such as size, color, alignment etc.. Applying styles is more effective than defining HTML element attributes. You can apply styling rules to each HTML element. Instead of applying style to each element individually, CSS classes are used to apply similar styling to groups of HTML elements to achieve uniform web page appearance. In BeautifulSoup, it is possible to find tags styled with CSS class. In this chapter, we shall use the following methods to search for elements for a specified CSS class −

  • find_all() and find() methods
  • select() and select_one() methods

Class in CSS

A class in CSS is a collection of attributes specifying the different features related to appearance, such as font type, size and color, background color, alignment etc. Name of the class is prefixed with a dot (.) while declaring it.

.class {  
   css declarations;  
}

A CSS class may be defined inline, or in a separate css file which needs to be included in the HTML script. A typical example of a CSS class could be as follows −

.blue-text {
   color: blue;
   font-weight: bold;
}

You can search for HTML elements defined with a certain class style with the help of following BeautifulSoup methods.

For the purpose of this chapter, we shall use the following HTML page −

<html>
   <head>
      <title>TutorialsPoint</title>
   </head>
   <body>
      <h2 class="heading">Departmentwise Employees</h2>
      <ul>
         <li class="mainmenu">Accounts</li>
         <ul>
            <li class="submenu">Anand</li>
            <li class="submenu">Mahesh</li>
         </ul>
         <li class="mainmenu">HR</li>
         <ul>
            <li class="submenu">Rani</li>
            <li class="submenu">Ankita</li>
         </ul>
      </ul>
   </body>
</html>

Using find() and find_all()

To search for elements with a certain CSS class used in a tag, use attrs property of Tag object as follows −

Example

from bs4 import BeautifulSoup

fp = open("index.html")
soup = BeautifulSoup(fp, 'html.parser')

obj = soup.find_all(attrs={"class": "mainmenu"})
print (obj)

Output

[<li class="mainmenu">Accounts</li>, <li class="mainmenu">HR</li>]

The result is a list of all the elements with mainmenu class

To fetch the list of elements with any of the CSS classes mentioned in in attrs property, change the find_all() statement to −

obj = soup.find_all(attrs={"class": ["mainmenu", "submenu"]})

This results into a list of all the elements with any of CSS classes used above.

[
   <li class="mainmenu">Accounts</li>, 
   <li class="submenu">Anand</li>, 
   <li class="submenu">Mahesh</li>, 
   <li class="mainmenu">HR</li>, 
   <li class="submenu">Rani</li>, 
   <li class="submenu">Ankita</li>
] 

Using select() and select_one()

You can also use select() method with the CSS selector as the argument. The (.) symbol followed by the name of the class is used as the CSS selector.

Example

from bs4 import BeautifulSoup

fp = open("index.html")
soup = BeautifulSoup(fp, 'html.parser')

obj = soup.select(".heading")
print (obj)

Output

[<h2 class="heading">Departmentwise Employees</h2>]

The select_one() method returns the first element found with the given class.

obj = soup.select_one(".submenu")
Advertisements