Facility: 086511

Superior Self Storage WY

Stale Data Warning: This facility has not been successfully scraped in 26 days (threshold: 3 days). Data may be outdated.
Facility Information active
Facility ID
086511
Name
Superior Self Storage WY
URL
https://www.superiorselfstoragewy.com/5104-cy-ave-casper-wy-82604
Address
N/A
Platform
custom_facility_086511
Parser File
src/parsers/custom/facility_086511_parser.py
Last Scraped
2026-03-27 14:04:12.906517
Created
2026-03-06 23:45:35.865957
Updated
2026-03-27 14:04:12.935687
Parser & Healing Diagnosis working
Parser Status
✓ Working
Status Reason
N/A
Last Healing Attempt
Not attempted
Parser Source (src/parsers/custom/facility_086511_parser.py)
"""Parser for Superior Self Storage WY (Casper, WY).

The site is a StorEdge-powered SPA. Unit data is rendered in a table
with class ``_3ogtyi-n17Czad9YYVE_mv``. Each ``<tr>`` row contains:
  - Cell 0: unit dimensions  (e.g. "5'x10'")
  - Cell 1: description text (e.g. "Self Storage", "Parking, RV Parking")
  - Cell 2: price            (e.g. "$45")
"""

from __future__ import annotations

import re

from bs4 import BeautifulSoup

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

# Matches dimension strings like  5'x10'  or  10'x10'
_SIZE_RE = re.compile(
    r"(\d+(?:\.\d+)?)['\u2019\u2032]?\s*[xX\u00d7]\s*(\d+(?:\.\d+)?)['\u2019\u2032]?",
)


class Facility086511Parser(BaseParser):
    """Extract storage units from Superior Self Storage WY (StorEdge SPA)."""

    platform = "custom_facility_086511"

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

        tbody = soup.select_one("._3ogtyi-n17Czad9YYVE_mv")
        if not tbody:
            result.warnings.append("Unit table not found (selector: ._3ogtyi-n17Czad9YYVE_mv)")
            return result

        rows = tbody.find_all("tr")
        for row in rows:
            cells = row.find_all("td")
            if len(cells) < 3:
                continue

            unit = UnitResult()

            # --- size ---
            size_text = cells[0].get_text(strip=True)
            if size_text:
                unit.size = size_text
                m = _SIZE_RE.search(size_text)
                if m:
                    width = float(m.group(1))
                    length = float(m.group(2))
                    unit.metadata = {"width": width, "length": length, "sqft": width * length}

            # --- description ---
            desc_text = cells[1].get_text(strip=True)
            if desc_text:
                unit.description = desc_text

            # --- price ---
            price_text = cells[2].get_text(strip=True)
            if price_text:
                unit.price = self.normalize_price(price_text)

            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 (7)

Run #2127 Details

Status
exported
Parser Used
Facility086511Parser
Platform Detected
storageunitsoftware
Units Found
2
Stage Reached
exported
Timestamp
2026-03-27 14:04:10.285319
Timing
Stage Duration
Fetch2527ms
Detect23ms
Parse11ms
Export20ms

Snapshot: 086511_20260327T140412Z.html · Show Snapshot · Open in New Tab

Parsed Units (2)

5'x10'

$45.00/mo

10'x10'

$85.00/mo

All Failures for this Facility (1)

fetch DatatypeMismatch unknown unknown permanent Run #19 | 2026-03-07 01:42:32.229774

column "success" is of type boolean but expression is of type integer LINE 3: ... VALUES ('086511', 19, '086511_20260307T014232Z.html', 0) ^ HINT: You will need to rewrite or cast the expression.

Stack trace
Traceback (most recent call last):
  File "/app/src/pipeline.py", line 329, in _process_facility
    manifest_id = storage.insert_snapshot_manifest(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/src/db/pg_backend.py", line 615, in insert_snapshot_manifest
    row = self._execute_returning(
          ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/src/db/pg_backend.py", line 54, in _execute_returning
    cur.execute(sql, params)
  File "/app/.venv/lib/python3.11/site-packages/psycopg2/extras.py", line 236, in execute
    return super().execute(query, vars)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
psycopg2.errors.DatatypeMismatch: column "success" is of type boolean but expression is of type integer
LINE 3: ...    VALUES ('086511', 19, '086511_20260307T014232Z.html', 0)
                                                                     ^
HINT:  You will need to rewrite or cast the expression.

← Back to dashboard