Facility: 061276
Self Storage WYO - Evansville
- Facility ID
- 061276
- Name
- Self Storage WYO - Evansville
- URL
- https://www.selfstoragewyo.com/5105-carroll-ct-evansville-wy-82636
- Address
- N/A
- Platform
- custom_facility_061276
- Parser File
- src/parsers/custom/facility_061276_parser.py
- Last Scraped
- 2026-03-23 03:19:20.857419
- Created
- 2026-03-06 23:45:35.865957
- Updated
- 2026-03-23 03:19:20.868956
- Parser Status
- ✓ Working
- Status Reason
- N/A
- Last Healing Attempt
- Not attempted
Parser Source (src/parsers/custom/facility_061276_parser.py)
"""Parser for Self Storage Wyo - Evansville, WY (facility 061276).
This is a React/MUI (Material UI) SPA that renders unit cards using
MuiCard components. Each card contains the unit data duplicated three
times for responsive breakpoints; we extract from the first occurrence only.
"""
from __future__ import annotations
import re
from bs4 import BeautifulSoup
from src.parsers.base import BaseParser, ParseResult, UnitResult
class Facility061276Parser(BaseParser):
"""Extract storage units from Self Storage Wyo MUI card layout.
Each unit is represented as a MuiCard-root div. The card inner content
is repeated three times for responsive layouts — we read only the first
child box (css-13pase6) to avoid duplicates.
Example card structure:
<div class="MuiCard-root ...">
<div class="MuiBox-root css-13pase6"> ← first (desktop) layout
<h5>5' x 5' Unit</h5>
<span class="MuiTypography-caption">1 unit available</span>
<h6 class="MuiTypography-h6">$65</h6>
<p ...>Climate Controlled</p>
<p ...>Inside</p>
</div>
... (two more duplicate boxes for mobile/tablet)
</div>
"""
platform = "custom_facility_061276"
# Matches dimension strings like "5' x 5'", "10' x 20'"
_DIM_RE = re.compile(
r"(\d+(?:\.\d+)?)['\u2019\u2032]?\s*[xX\u00d7]\s*(\d+(?:\.\d+)?)['\u2019\u2032]?",
re.IGNORECASE,
)
def parse(self, html: str, url: str = "") -> ParseResult:
soup = BeautifulSoup(html, "lxml")
result = ParseResult(platform=self.platform, parser_name=self.__class__.__name__)
# Each unit is a MuiCard-root div
cards = soup.select("div.MuiCard-root")
for card in cards:
# The card content is duplicated for responsive layouts.
# Use the first direct MuiBox child to avoid duplicate extraction.
first_box = card.find("div", class_=re.compile(r"MuiBox-root"))
if not first_box:
continue
unit = UnitResult()
# --- Size ---
# Title is in an h5 with MuiTypography-h5 class
size_el = first_box.find("h5", class_=re.compile(r"MuiTypography-h5"))
if size_el:
size_text = size_el.get_text(strip=True)
unit.size = size_text
m = self._DIM_RE.search(size_text)
if m:
w = float(m.group(1))
ln = float(m.group(2))
unit.metadata = {"width": w, "length": ln, "sqft": w * ln}
# --- Price ---
# Price is in the inner h6 with MuiTypography-h6 class
price_el = first_box.find("h6", class_=re.compile(r"MuiTypography-h6"))
if price_el:
unit.price = self.normalize_price(price_el.get_text(strip=True))
# --- Scarcity ---
# Availability text is in a span with MuiTypography-caption class
avail_el = first_box.find("span", class_=re.compile(r"MuiTypography-caption"))
if avail_el:
unit.scarcity = avail_el.get_text(strip=True)
# --- Features / Description ---
# Amenity tags are <p> elements with MuiTypography-body1 class
feature_els = first_box.find_all("p", class_=re.compile(r"MuiTypography-body1"))
if feature_els:
features = [p.get_text(strip=True) for p in feature_els if p.get_text(strip=True)]
if features:
unit.description = ", ".join(features)
if unit.metadata is None:
unit.metadata = {}
unit.metadata["features"] = features
# Only add units that have at minimum a size or price
if unit.size or unit.price:
result.units.append(unit)
if not result.units:
result.warnings.append("No units found on page")
return result
Scrape Runs (5)
-
exported Run #14802026-03-23 03:19:15.535318 | 7 units | Facility061276Parser | View Data →
-
exported Run #9872026-03-21 19:12:11.964225 | 7 units | Facility061276Parser | View Data →
-
exported Run #5402026-03-14 16:54:37.050197 | 7 units | Facility061276Parser | View Data →
-
exported Run #1422026-03-14 01:06:25.578776 | 7 units | Facility061276Parser | View Data →
-
exported Run #652026-03-13 21:40:53.836649 | 7 units | Facility061276Parser | View Data →
Run #540 Details
- Status
- exported
- Parser Used
- Facility061276Parser
- Platform Detected
- storageunitsoftware
- Units Found
- 7
- Stage Reached
- exported
- Timestamp
- 2026-03-14 16:54:37.050197
Timing
| Stage | Duration |
|---|---|
| Fetch | 4339ms |
| Detect | 70ms |
| Parse | 17ms |
| Export | 16ms |
Snapshot: 061276_20260314T165441Z.html · Show Snapshot · Open in New Tab
Parsed Units (7)
10' x 10' Unit
$105.00/mo
5' x 5' Unit
$65.00/mo
1 unit available
5' x 10' Unit
$75.00/mo
5' x 10' Unit
$65.00/mo
10' x 10' Unit
$85.00/mo
10' x 15' Unit
$100.00/mo
10' x 15' Unit
$125.00/mo