Facility: 000469

Pearl Street Self Storage

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
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 & Healing Diagnosis working
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)

Run #1813 Details

Status
exported
Parser Used
Facility000469Parser
Platform Detected
table_layout
Units Found
8
Stage Reached
exported
Timestamp
2026-03-27 13:51:36.455342
Timing
Stage Duration
Fetch4624ms
Detect14ms
Parse6ms
Export20ms

Snapshot: 000469_20260327T135141Z.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

← Back to dashboard