Facility: 106926

Pink Door Storage & RV - Clinton

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
106926
Name
Pink Door Storage & RV - Clinton
URL
https://www.pinkdoorstorage.com/self-storage-rv-parking-clinton#/unit/listing
Address
2277 W 1300 N, Clinton, UT 84015, USA, Clinton, Utah 84015
Platform
custom_facility_106926
Parser File
src/parsers/custom/facility_106926_parser.py
Last Scraped
2026-03-27 13:46:35.925824
Created
2026-03-20 23:23:10.660695
Updated
2026-03-27 13:46:35.957251
Parser & Healing Diagnosis working
Parser Status
✓ Working
Status Reason
N/A
Last Healing Attempt
Not attempted
Parser Source (src/parsers/custom/facility_106926_parser.py)
"""Parser for Pink Door Storage & RV - Clinton."""

from __future__ import annotations

import re

from bs4 import BeautifulSoup

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


class Facility106926Parser(BaseParser):
    """Extract storage units from Pink Door Storage using Apollo state JSON."""

    platform = "custom_facility_106926"

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

        # Pink Door uses Apollo state with UnitGroup objects
        # Pattern: {"id":"...","name":"10x10","type":"Drive Up","price":111,"__typename":"UnitGroup"}
        unit_groups = re.findall(
            r'"name":"(\d+x\d+)","type":"([^"]+)","price":(\d+),"__typename":"UnitGroup"',
            html,
        )

        seen: dict[str, tuple[str, float]] = {}
        for name, unit_type, price_str in unit_groups:
            price = float(price_str)
            if price == 0:
                continue
            # Skip units with 0 dimension
            parts = name.split("x")
            if len(parts) == 2 and (parts[0] == "0" or parts[1] == "0"):
                continue
            # Keep lowest price per (name, type) combination
            key = f"{name}|{unit_type}"
            if key not in seen or price < seen[key][1]:
                seen[key] = (unit_type, price)

        for key, (unit_type, price) in sorted(seen.items()):
            name = key.split("|")[0]
            unit = UnitResult()
            unit.size = name
            unit.price = price
            unit.unit_type = unit_type
            w, ln, sq = self.normalize_size(name)
            if w is not None:
                unit.metadata = {"width": w, "length": ln, "sqft": sq}
            result.units.append(unit)

        if not result.units:
            result.warnings.append("No units found on page")

        return result

Scrape Runs (4)

Run #1693 Details

Status
exported
Parser Used
Facility106926Parser
Platform Detected
storageunitsoftware
Units Found
44
Stage Reached
exported
Timestamp
2026-03-27 13:46:24.327078
Timing
Stage Duration
Fetch11346ms
Detect116ms
Parse2ms
Export22ms

Snapshot: 106926_20260327T134635Z.html · Show Snapshot · Open in New Tab

Parsed Units (44)

10x10

$111.00/mo

10x10

$109.00/mo

10x10

$150.00/mo

10x10

$125.00/mo

10x10

$174.00/mo

10x10

$157.00/mo

10x10

$158.00/mo

10x15

$134.00/mo

10x15

$152.00/mo

10x15

$186.00/mo

10x20

$165.00/mo

10x20

$167.00/mo

10x20

$187.00/mo

10x20

$211.00/mo

10x20

$195.00/mo

10x25

$185.00/mo

10x25

$182.00/mo

10x25

$233.00/mo

10x25

$200.00/mo

10x25

$254.00/mo

10x25

$240.00/mo

10x30

$68.00/mo

10x30

$199.00/mo

10x30

$242.00/mo

10x30

$250.00/mo

10x30

$90.00/mo

10x35

$73.00/mo

10x35

$108.00/mo

10x40

$100.00/mo

10x40

$340.00/mo

10x40

$345.00/mo

10x40

$120.00/mo

10x45

$159.00/mo

10x50

$149.00/mo

10x50

$160.00/mo

10x5

$111.00/mo

12x25

$249.00/mo

12x40

$199.00/mo

12x40

$185.00/mo

12x50

$225.00/mo

12x50

$210.00/mo

5x10

$95.00/mo

5x10

$90.00/mo

5x5

$79.00/mo

← Back to dashboard