Facility: 000469
Pearl Street Self Storage
- Facility ID
- 000469
- Name
- Pearl Street Self Storage
- URL
- https://pearlstreetselfstorage.com/app/secure-safe-storage-options/
- Address
- 1001 N Pearl St, Tacoma, WA 98406, USA, Tacoma, Washington 98406
- Platform
- custom_facility_000469
- Parser File
- src/parsers/custom/facility_000469_parser.py
- Last Scraped
- 2026-03-27 13:51:41.417348
- Created
- 2026-03-14 16:21:53.706708
- Updated
- 2026-03-27 13:51:41.443743
- Parser Status
- ✓ Working
- Status Reason
- N/A
- Last Healing Attempt
- Not attempted
Parser Source (src/parsers/custom/facility_000469_parser.py)
"""Parser for Pearl Street Self Storage."""
from __future__ import annotations
import re
from bs4 import BeautifulSoup
from src.parsers.base import BaseParser, ParseResult, UnitResult
class Facility000469Parser(BaseParser):
"""Extract storage units from Pearl Street Self Storage.
This facility does not publish prices online. The storage options page
lists unit sizes in an accordion layout with descriptions but no pricing.
Units are extracted with size and description only.
"""
platform = "custom_facility_000469"
# Matches patterns like "5x5 / Small Closet" or "10x20 / Small Home-Business Inventory"
_ACCORDION_RE = re.compile(
r"(\d+)\s*[xX×]\s*(\d+)\s*/\s*(.+)"
)
def parse(self, html: str, url: str = "") -> ParseResult:
soup = BeautifulSoup(html, "lxml")
result = ParseResult(platform=self.platform, parser_name=self.__class__.__name__)
# Find accordion title links that contain unit size info
accordion_links = soup.find_all("a", class_="tb_title_accordion")
for link in accordion_links:
text = link.get_text(strip=True)
m = self._ACCORDION_RE.match(text)
if not m:
continue
width_str = m.group(1)
length_str = m.group(2)
description = m.group(3).strip()
size_text = f"{width_str}x{length_str}"
unit = UnitResult()
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}
unit.description = description
# No prices published on this site
unit.price = None
result.units.append(unit)
if not result.units:
result.warnings.append("No units found in accordion layout")
else:
result.warnings.append("No prices published on this facility website")
return result
Scrape Runs (5)
-
exported Run #18132026-03-27 13:51:36.455342 | 8 units | Facility000469Parser | View Data →
-
exported Run #18122026-03-27 13:51:36.376401 | 8 units | Facility000469Parser | View Data →
-
exported Run #11692026-03-23 02:53:09.016447 | 8 units | Facility000469Parser | View Data →
-
exported Run #6762026-03-21 18:44:24.549340 | 8 units | Facility000469Parser | View Data →
-
exported Run #2252026-03-14 16:26:31.688995 | 8 units | Facility000469Parser | View Data →
Run #1169 Details
- Status
- exported
- Parser Used
- Facility000469Parser
- Platform Detected
- table_layout
- Units Found
- 8
- Stage Reached
- exported
- Timestamp
- 2026-03-23 02:53:09.016447
Timing
| Stage | Duration |
|---|---|
| Fetch | 4025ms |
| Detect | 143ms |
| Parse | 14ms |
| Export | 5ms |
Snapshot: 000469_20260323T025313Z.html · Show Snapshot · Open in New Tab
Parsed Units (8)
5x5
No price
5x10
No price
10x10
No price
10x15
No price
10x20
No price
10x25
No price
10x30
No price
12x35
No price