Facility: 111356
Silver Star Storage
- Facility ID
- 111356
- Name
- Silver Star Storage
- URL
- https://www.silverstarstorage.com/locations/houston-tx-77098/
- Address
- 2505 Southwest Fwy, Houston, TX 77098
- Platform
- custom_facility_111356
- Parser File
- src/parsers/custom/facility_111356_parser.py
- Last Scraped
- 2026-03-27 13:45:25.355486
- Created
- 2026-03-20 23:32:48.933261
- Updated
- 2026-03-27 13:45:25.395735
- Parser Status
- ✓ Working
- Status Reason
- N/A
- Last Healing Attempt
- Not attempted
Parser Source (src/parsers/custom/facility_111356_parser.py)
"""Parser for Silver Star Storage facility 111356."""
from __future__ import annotations
import re
from bs4 import BeautifulSoup
from src.parsers.base import BaseParser, ParseResult, UnitResult
class Facility111356Parser(BaseParser):
"""Extract storage units from Silver Star Storage pages (Vue.js / dragon-card platform).
Units are in div.unit-card (also class dragon-card) elements. Each card has:
- span.dimensions: dimension text (e.g. "3' x 5'")
- span.unit-price div.price-normal span: discounted/web rate
- span.unit-price div.price-discount.price-strikethrough span: in-store/original rate
"""
platform = "custom_facility_111356"
def parse(self, html: str, url: str = "") -> ParseResult:
soup = BeautifulSoup(html, "lxml")
result = ParseResult(platform=self.platform, parser_name=self.__class__.__name__)
seen: set[tuple[str, str]] = set()
for card in soup.find_all(class_="unit-card"):
# --- size ---
dim_el = card.find(class_="dimensions")
if not dim_el:
continue
size_text = dim_el.get_text(strip=True)
# --- price (web/discounted rate) ---
price_wrapper = card.find(class_="unit-price")
if not price_wrapper:
continue
price_el = price_wrapper.find(class_="price-normal")
if not price_el:
continue
price_text = price_el.get_text(strip=True)
price = self.normalize_price(price_text)
if price is None:
continue
key = (size_text, price_text)
if key in seen:
continue
seen.add(key)
# --- original rate (strikethrough) ---
orig_el = price_wrapper.find(class_="price-strikethrough")
sale_price: float | None = None
if orig_el:
sale_price = self.normalize_price(orig_el.get_text(strip=True))
unit = UnitResult(
size=size_text,
price=price,
sale_price=sale_price,
)
w, ln, sq = self.normalize_size(size_text)
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 in Silver Star unit-card elements")
return result
Scrape Runs (4)
-
exported Run #16752026-03-27 13:45:18.471589 | 6 units | Facility111356Parser | View Data →
-
exported Run #16742026-03-27 13:45:18.384335 | 6 units | Facility111356Parser | View Data →
-
exported Run #10992026-03-23 02:45:52.618578 | 6 units | Facility111356Parser | View Data →
-
exported Run #6052026-03-21 18:36:05.616029 | 6 units | Facility111356Parser | View Data →
Run #605 Details
- Status
- exported
- Parser Used
- Facility111356Parser
- Platform Detected
- table_layout
- Units Found
- 6
- Stage Reached
- exported
- Timestamp
- 2026-03-21 18:36:05.616029
Timing
| Stage | Duration |
|---|---|
| Fetch | 5494ms |
| Detect | 128ms |
| Parse | 51ms |
| Export | 5ms |
Snapshot: 111356_20260321T183611Z.html · Show Snapshot · Open in New Tab
Parsed Units (6)
3' x 5'
$111.00/mo
Street: $75.00
5' x 5'
$37.00/mo
Street: $30.00
5' x 10'
$102.00/mo
Street: $85.00
7.5' x 10'
$131.00/mo
Street: $110.00
10' x 10'
$176.00/mo
Street: $130.00
10' x 12.5'
$271.00/mo
Street: $212.00