Facility: 093362

Palm Tree 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
093362
Name
Palm Tree Storage
URL
https://www.palmtreestorage.com/
Address
2700 Fm 56, Glen Rose, TX 76043, USA, Glen Rose, Texas 76043
Platform
custom_facility_093362
Parser File
src/parsers/custom/facility_093362_parser.py
Last Scraped
2026-03-27 13:46:16.280730
Created
2026-03-20 23:23:10.660695
Updated
2026-03-27 13:46:16.315796
Parser & Healing Diagnosis working
Parser Status
✓ Working
Status Reason
N/A
Last Healing Attempt
Not attempted
Parser Source (src/parsers/custom/facility_093362_parser.py)
"""Parser for Palm Tree Storage."""

from __future__ import annotations

import re

from bs4 import BeautifulSoup

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


class Facility093362Parser(BaseParser):
    """Extract storage units from Palm Tree Storage."""

    platform = "custom_facility_093362"

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

        # Unit sizes are in h4 elements with class x-el-h4
        # Sizes like "5 X 10", "10 X 10", "10 X 15", "10 X 20", "10 X 30"
        size_pattern = re.compile(r"\d+\s*[xX]\s*\d+")

        seen_sizes = set()
        for h4 in soup.select("h4.x-el-h4"):
            text = h4.get_text(strip=True)
            if size_pattern.search(text):
                normalized = re.sub(r"\s+", " ", text).strip()
                if normalized not in seen_sizes:
                    seen_sizes.add(normalized)
                    unit = UnitResult()
                    unit.size = normalized
                    unit.description = normalized if " " in normalized and len(normalized) > 6 else None
                    w, ln, sq = self.normalize_size(normalized)
                    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 #1689 Details

Status
exported
Parser Used
Facility093362Parser
Platform Detected
table_layout
Units Found
6
Stage Reached
exported
Timestamp
2026-03-27 13:46:14.179880
Timing
Stage Duration
Fetch2004ms
Detect19ms
Parse8ms
Export22ms

Snapshot: 093362_20260327T134616Z.html · Show Snapshot · Open in New Tab

Parsed Units (6)

5 X 10

No price

10 X 10

No price

10 X 15

No price

10 X 20

No price

10 X 30

No price

12 X 40 Covered RV Parking (Glen Rose)

No price

← Back to dashboard