Facility: 059225

Green Valley Mini Storage Llc

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
059225
Name
Green Valley Mini Storage Llc
URL
https://www.greenvalleyministorage.com/
Address
5428 Green Valley Rd, Lebanon, VA 24266, USA, Lebanon, Virginia 24266
Platform
custom_facility_059225
Parser File
src/parsers/custom/facility_059225_parser.py
Last Scraped
2026-03-27 13:45:12.700492
Created
2026-03-20 23:23:10.660695
Updated
2026-03-27 13:45:12.731624
Parser & Healing Diagnosis working
Parser Status
✓ Working
Status Reason
N/A
Last Healing Attempt
Not attempted
Parser Source (src/parsers/custom/facility_059225_parser.py)
"""Parser for Green Valley Mini Storage LLC."""

from __future__ import annotations

import re

from bs4 import BeautifulSoup

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


class Facility059225Parser(BaseParser):
    """Extract storage units from Green Valley Mini Storage LLC (unittrac platform)."""

    platform = "custom_facility_059225"

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

        # Each unit is in an outer table with width="100%" containing an image,
        # a nested table with the size/sqft, and a badge div for availability.
        containers = soup.find_all("table", attrs={"width": "100%"})

        for container in containers:
            # Must contain a size span (bold, 15px font)
            size_el = container.select_one('span[style*="font-size: 15px"]')
            if not size_el:
                continue

            size_text = size_el.get_text(strip=True)
            if not re.search(r"\d", size_text):
                continue

            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}

            # Availability badge
            avail_el = container.find("div", class_=re.compile(r"badge"))
            if avail_el:
                avail_text = avail_el.get_text(strip=True)
                avail_match = re.search(r"(\d+)\s+Available", avail_text, re.I)
                if avail_match:
                    avail_count = int(avail_match.group(1))
                    if unit.metadata is None:
                        unit.metadata = {}
                    unit.metadata["available"] = avail_count
                    unit.scarcity = f"{avail_count} available"

            result.units.append(unit)

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

        return result

Scrape Runs (4)

Run #1097 Details

Status
exported
Parser Used
Facility059225Parser
Platform Detected
table_layout
Units Found
9
Stage Reached
exported
Timestamp
2026-03-23 02:45:43.189138
Timing
Stage Duration
Fetch2663ms
Detect21ms
Parse21ms
Export4ms

Snapshot: 059225_20260323T024545Z.html · Show Snapshot · Open in New Tab

Parsed Units (9)

6 x 8

No price
0 available

5 x 10

No price
1 available

8 x 8

No price
0 available

7 x 10

No price
0 available

6 x 12

No price
0 available

8 x 10

No price
1 available

8 x 12

No price
0 available

10 x 10

No price
1 available

10 x 13

No price
0 available

← Back to dashboard