Have you ever tried parsing HTML using BeautifulSoup and suddenly got slapped with an error like this?
KeyError: 'class'
Yep, it happened to me too and at first, I couldn’t understand what I did wrong. So today, I’m breaking it down in the simplest way possible so you never get stuck on this again.
Understand the Error
Here’s the exact code I started with:
soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs:
if (div["class"] == "stylelistrow"):
print(div)
And here’s the error Python threw at me:
KeyError: 'class'
Why Does This Happen
Not all <div>
elements in the HTML have a class
attribute. When I try to access div["class"]
, Python behaves just like a dictionary if the key doesn’t exist, it throws a KeyError.
It’s the same as trying to do this:
my_dict = {}
print(my_dict["name"]) # Boom! KeyError: 'name'
So the solution is simple: don’t assume every element has a class — check first.
Correct and Safer Version
from bs4 import BeautifulSoup
soup = BeautifulSoup(sdata, "html.parser")
mydivs = soup.find_all('div')
for div in mydivs:
if div.get("class") == ["stylelistrow"]: # Note: class returns a list
print(div)
Why this works
.get("class")
returns None
instead of crashing if the element doesn’t have a class.
BeautifulSoup treats class
as a list, so I compare it to ["stylelistrow"]
instead of "stylelistrow"
.
Better & Cleaner Version
BeautifulSoup is smarter than we think it can filter elements by class directly.
for div in soup.find_all("div", class_="stylelistrow"):
print(div)
This is clean, readable, and the recommended way to search by class.
Practice Project Extract & Save Matching Elements
To make things more practical, I expanded the code with additional features like counting elements and saving results to a file.
from bs4 import BeautifulSoup
# Example HTML for testing
sdata = """
<html>
<body>
<div class="stylelistrow">Row 1</div>
<div class="stylelistrow">Row 2</div>
<div>No Class Div</div>
<div class="anotherclass">Other Div</div>
</body>
</html>
"""
soup = BeautifulSoup(sdata, "html.parser")
# 1. Print all matching divs
print("Divs with class='stylelistrow':")
for div in soup.find_all("div", class_="stylelistrow"):
print(" -", div.text)
# 2. Count them
count = len(soup.find_all("div", class_="stylelistrow"))
print("\nTotal matched divs:", count)
# 3. Store them in a list
matched_texts = [div.text for div in soup.find_all("div", class_="stylelistrow")]
print("\nList of extracted texts:", matched_texts)
# 4. Save them to a file for practice
with open("output.txt", "w") as f:
f.write("\n".join(matched_texts))
print("\nSaved to output.txt")
Final Thought
Errors like KeyError: 'class'
may seem intimidating at first, but they’re simply reminders to write safer and more flexible code. Once I learned to check for missing attributes instead of assuming everything exists, my scraping scripts became far more reliable. Always code defensively trust the data only after you verify it.