Facility: 014818

Casper Mini Storage WY

Stale Data Warning: This facility has not been successfully scraped in 30 days (threshold: 3 days). Data may be outdated.
⚠ Unit Count Anomaly (Critical): Current run has 0 units, expected baseline is 9 (-100.0% change, delta: -9).
Facility Information active
Facility ID
014818
Name
Casper Mini Storage WY
URL
https://www.casperministoragewy.com/1989-oil-dr-casper-wy-82604-1510
Address
N/A
Platform
custom_facility_014818
Parser File
src/parsers/custom/facility_014818_parser.py
Last Scraped
2026-03-23 03:17:53.877789
Created
2026-03-06 23:45:35.865957
Updated
2026-03-23 03:17:53.883200
Parser & Healing Diagnosis working
Parser Status
✓ Working
Status Reason
N/A
Last Healing Attempt
Not attempted
Parser Source (src/parsers/custom/facility_014818_parser.py)
"""Parser for Casper Mini Storage (Casper, WY).

This site uses the StorEdge/storageunitsoftware platform but with obfuscated
CSS class names that don't match the standard selectors. Units are listed in
a standard HTML table with columns for Size, Unit Details, and Price.
"""

from __future__ import annotations

from bs4 import BeautifulSoup

from src.parsers.base import BaseParser, ParseResult, UnitResult


class Facility014818Parser(BaseParser):
    """Extract storage units from Casper Mini Storage.

    The page renders a table with obfuscated class names. Rows are parsed by
    positional column order: Size (col 0), Unit Details (col 1), Price (col 2).
    """

    platform = "custom_facility_014818"

    # CSS class for the size text element inside the first column
    _SIZE_CLASS = "_2MVARJZtZDaHzpMVh0UAfo"
    # CSS class for the price element inside the third column
    _PRICE_CLASS = "_3V2N9w-4bQvYJ9lUWBSkHt"
    # CSS class for the unit details cell (second column)
    _DETAILS_CLASS = "_3EinRJ2x40cEGL2u1cR9Qc"
    # CSS class for the units table
    _TABLE_CLASS = "_2QREMkZenGaFOjxHn8CDhU"

    def parse(self, html: str, url: str = "") -> ParseResult:
        soup = BeautifulSoup(html, "lxml")
        result = ParseResult(platform=self.platform, parser_name=self.__class__.__name__)

        table = soup.find("table", class_=self._TABLE_CLASS)
        if not table:
            result.warnings.append("Unit table not found on page")
            return result

        tbody = table.find("tbody")
        if not tbody:
            result.warnings.append("Table body not found")
            return result

        rows = tbody.find_all("tr")
        for row in rows:
            unit = UnitResult()

            # Extract size
            size_el = row.find("div", class_=self._SIZE_CLASS)
            if size_el:
                size_text = size_el.get_text(strip=True)
                unit.size = size_text
                w, ln, sq = self.normalize_size(size_text)
                if w is not None:
                    unit.metadata = {"width": w, "length": ln, "sqft": sq}

            # Extract price
            price_el = row.find("div", class_=self._PRICE_CLASS)
            if price_el:
                unit.price = self.normalize_price(price_el.get_text(strip=True))

            # Extract unit details / description
            details_el = row.find("td", class_=self._DETAILS_CLASS)
            if details_el:
                unit.description = details_el.get_text(strip=True, separator=" ").strip()

            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)

Run #40 Details

Status
exported
Parser Used
StorageUnitSoftwareParser
Platform Detected
storageunitsoftware
Units Found
0
Stage Reached
exported
Timestamp
2026-03-13 19:10:23.244940
Timing
Stage Duration
Fetch3281ms
Detect27ms
Parse36ms
Export8ms

Snapshot: 014818_20260313T191026Z.html · Show Snapshot · Open in New Tab

No units found in this run.

All Failures for this Facility (1)

parse _WarningAsException scraper no_units_extracted warning Run #N/A | 2026-03-13 19:10:26.621252

No units extracted for 014818

Stack trace
src.reporting.failure_reporter._WarningAsException: No units extracted for 014818

← Back to dashboard