Facility: 102841

The Storage Place

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
102841
Name
The Storage Place
URL
https://thestorageplace.org/storage-units/texas/waxahachie/fm-66
Address
1812 Fm 66, Waxahachie, TX 75167, USA, Waxahachie, Texas 75167
Platform
custom_facility_102841
Parser File
src/parsers/custom/facility_102841_parser.py
Last Scraped
2026-03-27 13:42:47.099821
Created
2026-03-23 02:35:08.816820
Updated
2026-03-27 13:42:47.129202
Parser & Healing Diagnosis working
Parser Status
✓ Working
Status Reason
N/A
Last Healing Attempt
Not attempted
Parser Source (src/parsers/custom/facility_102841_parser.py)
"""Parser for The Storage Place - Waxahachie (Storagely platform)."""

from __future__ import annotations

import re

from bs4 import BeautifulSoup

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


class Facility102841Parser(BaseParser):
    """Extract storage units from The Storage Place Waxahachie (Storagely)."""

    platform = "custom_facility_102841"

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

        rows = soup.select("div.listviewrows")

        for row in rows:
            unit = UnitResult()

            # Extract size from h2.widthHeight containing <yy> and <xx> elements
            wh = row.select_one("h2.widthHeight")
            if wh:
                yy = wh.select_one("yy")
                xx = wh.select_one("xx")
                w_text = yy.get_text(strip=True).replace("WIDTH", "").strip() if yy else ""
                d_text = xx.get_text(strip=True).replace("DEPTH", "").strip() if xx else ""
                if w_text and d_text:
                    unit.size = f"{w_text} x {d_text}"
                    w, ln, sq = self.normalize_size(unit.size)
                    if w is not None:
                        unit.metadata = {"width": w, "length": ln, "sqft": sq}

            # Extract unit type (Climate Control, Drive Up, etc.)
            type_el = row.select_one("div.unit-type-listing-name")
            if type_el:
                # Get just the first text node (not the hidden span)
                unit_type = type_el.contents[0].strip() if type_el.contents else ""
                if unit_type:
                    unit.description = unit_type

            # Extract prices from priceSection
            price_section = row.select_one("div.priceSection")
            if price_section:
                # Sale/promo price
                sale_price_el = price_section.select_one("h3.actualMoPrice")
                if sale_price_el:
                    price_text = sale_price_el.get_text(strip=True)
                    pm = re.search(r"\$(\d[\d,.]*)", price_text)
                    if pm:
                        unit.sale_price = self.normalize_price(pm.group(1))

                # Regular price (without discount)
                reg_price_el = price_section.select_one("h3.withoutDiscntprice")
                if reg_price_el:
                    reg_text = reg_price_el.get_text(strip=True)
                    pm = re.search(r"\$(\d[\d,.]*)", reg_text)
                    if pm:
                        unit.price = self.normalize_price(pm.group(1))

                # If no regular price, use sale price as regular
                if unit.price is None and unit.sale_price is not None:
                    unit.price = unit.sale_price
                    unit.sale_price = None

            # Extract promotion text
            promo_el = row.select_one("span.offer__content")
            if promo_el:
                unit.promotion = promo_el.get_text(strip=True)

            if unit.size or unit.price:
                result.units.append(unit)

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

        return result

Scrape Runs (3)

Run #1600 Details

Status
exported
Parser Used
Facility102841Parser
Platform Detected
ccstorage
Units Found
20
Stage Reached
exported
Timestamp
2026-03-27 13:42:33.918138
Timing
Stage Duration
Fetch12440ms
Detect127ms
Parse120ms
Export19ms

Snapshot: 102841_20260327T134246Z.html · Show Snapshot · Open in New Tab

Parsed Units (20)

5' x 5'

$18.00/mo
Street: $35.00

10' x 5'

$35.00/mo
Street: $69.00

5' x 10'

$58.00/mo
Street: $115.00

10' x 10'

$55.00/mo
Street: $109.00

10' x 10'

$78.00/mo
Street: $155.00

10' x 15'

$48.00/mo
Street: $95.00

10' x 15'

$112.00/mo
Street: $224.00

10' x 20'

$82.00/mo
Street: $163.00

10' x 30'

$125.00/mo
Street: $249.00

12' x 25'

$150.00/mo
Street: $300.00

13' x 25'

$50.00/mo
Street: $99.00

10' x 40'

$50.00/mo
Street: $99.00

12' x 75'

$60.00/mo
Street: $119.00

9' x 11'

$0.00/mo

10' x 20'

$0.00/mo

30' x 11'

$110.00/mo
Street: $220.00

8' x 45'

$71.00/mo
Street: $142.00

15' x 30'

$165.00/mo
Street: $329.00

50' x 40'

$4235.00/mo
Street: $8470.00

50' x 110'

$4235.00/mo
Street: $8470.00

← Back to dashboard