Facility: 107877

Buffalo WYO Storage

Stale Data Warning: This facility has not been successfully scraped in 30 days (threshold: 3 days). Data may be outdated.
Facility Information active
Facility ID
107877
Name
Buffalo WYO Storage
URL
https://www.buffalowyostorage.com/56-t-w-rd-buffalo-wy-82834
Address
N/A
Platform
custom_facility_107877
Parser File
src/parsers/custom/facility_107877_parser.py
Last Scraped
2026-03-23 03:21:42.481920
Created
2026-03-06 23:45:35.865957
Updated
2026-03-23 03:21:42.489358
Parser & Healing Diagnosis working
Parser Status
✓ Working
Status Reason
N/A
Last Healing Attempt
Not attempted
Parser Source (src/parsers/custom/facility_107877_parser.py)
"""Parser for Buffalo WY Storage (buffalowyostorage.com) — MUI React app."""

from __future__ import annotations

import re

from bs4 import BeautifulSoup

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


class Facility107877Parser(BaseParser):
    """Extract storage units from the MUI-based React storefront at buffalowyostorage.com."""

    platform = "custom_facility_107877"

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

        # Each unit type is rendered as a MuiCard-root div.
        # The card duplicates its inner content for responsive layouts, so we
        # take only the FIRST inner box (css-8atqhb) to avoid duplicates.
        cards = soup.find_all("div", class_=re.compile(r"\bMuiCard-root\b"))

        for card in cards:
            # First inner content box — skip the duplicate (mobile/desktop variant)
            box = card.find("div", class_=re.compile(r"\bcss-8atqhb\b"))
            if not box:
                continue

            unit = UnitResult()

            # Size — rendered as an <h5>
            size_el = box.find("h5")
            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}

            # Price — the dollar amount is in an <h6 class="MuiTypography-h6">
            price_el = box.find("h6", class_=re.compile(r"\bMuiTypography-h6\b"))
            if price_el:
                unit.price = self.normalize_price(price_el.get_text(strip=True))

            # Description / amenity type — rendered as a <p class="MuiTypography-body1 …">
            desc_el = box.find("p", class_=re.compile(r"\bMuiTypography-body1\b"))
            if desc_el:
                unit.description = desc_el.get_text(strip=True)

            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 #1006 Details

Status
exported
Parser Used
Facility107877Parser
Platform Detected
storageunitsoftware
Units Found
5
Stage Reached
exported
Timestamp
2026-03-21 19:14:57.004156
Timing
Stage Duration
Fetch5291ms
Detect58ms
Parse31ms
Export11ms

Snapshot: 107877_20260321T191502Z.html · Show Snapshot · Open in New Tab

Parsed Units (5)

10' x 15' Unit

$80.00/mo

10' x 20' Unit

$130.00/mo

10' x 30' Unit

$50.00/mo

10' x 40' Unit

$60.00/mo

13' x 40' Unit

$80.00/mo

← Back to dashboard