Facility: 106926
Pink Door Storage & RV - Clinton
- 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 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)
-
exported Run #16932026-03-27 13:46:24.327078 | 44 units | Facility106926Parser | View Data →
-
exported Run #16922026-03-27 13:46:23.813114 | 44 units | Facility106926Parser | View Data →
-
exported Run #11092026-03-23 02:47:54.550063 | 44 units | Facility106926Parser | View Data →
-
exported Run #6142026-03-21 18:37:33.544036 | 44 units | Facility106926Parser | View Data →
Run #1109 Details
- Status
- exported
- Parser Used
- Facility106926Parser
- Platform Detected
- storageunitsoftware
- Units Found
- 44
- Stage Reached
- exported
- Timestamp
- 2026-03-23 02:47:54.550063
Timing
| Stage | Duration |
|---|---|
| Fetch | 8859ms |
| Detect | 208ms |
| Parse | 3ms |
| Export | 9ms |
Snapshot: 106926_20260323T024803Z.html · Show Snapshot · Open in New Tab
Parsed Units (44)
10x10
$174.00/mo
10x10
$123.00/mo
10x10
$111.00/mo
10x10
$106.00/mo
10x10
$150.00/mo
10x10
$157.00/mo
10x10
$158.00/mo
10x15
$134.00/mo
10x15
$160.00/mo
10x15
$186.00/mo
10x20
$170.00/mo
10x20
$167.00/mo
10x20
$187.00/mo
10x20
$211.00/mo
10x20
$195.00/mo
10x25
$185.00/mo
10x25
$193.00/mo
10x25
$233.00/mo
10x25
$211.00/mo
10x25
$254.00/mo
10x25
$240.00/mo
10x30
$68.00/mo
10x30
$199.00/mo
10x30
$242.00/mo
10x30
$259.00/mo
10x30
$90.00/mo
10x35
$73.00/mo
10x35
$108.00/mo
10x40
$100.00/mo
10x40
$340.00/mo
10x40
$349.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
$250.00/mo
12x40
$225.00/mo
12x50
$290.00/mo
12x50
$265.00/mo
5x10
$95.00/mo
5x10
$90.00/mo
5x5
$79.00/mo