Facility: 018103
Ontario Mini Storage OR
- Facility ID
- 018103
- Name
- Ontario Mini Storage OR
- URL
- https://www.ontarioministorageor.com/
- Address
- N/A
- Platform
- custom_facility_018103
- Parser File
- src/parsers/custom/facility_018103_parser.py
- Last Scraped
- 2026-03-23 03:16:56.406050
- Created
- 2026-03-06 23:45:35.865957
- Updated
- 2026-03-23 03:16:56.417476
- Parser Status
- ✓ Working
- Status Reason
- N/A
- Last Healing Attempt
- Not attempted
Parser Source (src/parsers/custom/facility_018103_parser.py)
"""Parser for Ontario Mini Storage facility (018103).
This site uses the WL Storage white-label platform with a custom WordPress theme.
Units are rendered inside `div.filtered-item` containers. Each container includes:
- A size heading (h5 inside `.filter-item-detail.size`)
- A description line (location/type below the size)
- A promotional label (`id="promo-center-<uuid>"`)
- A sale price (`h5[id^="price-"]`) and a regular/street price (`h5[id^="slashed-price-"]`)
- An availability span (`.available-count span`)
"""
from __future__ import annotations
from bs4 import BeautifulSoup, Tag
from src.parsers.base import BaseParser, ParseResult, UnitResult
class Facility018103Parser(BaseParser):
"""Extract storage units from Ontario Mini Storage (WL Storage platform).
Each `div.filtered-item` represents a single unit type. Prices are stored
in h5 elements with id attributes prefixed with ``price-`` (sale/web rate)
and ``slashed-price-`` (regular/street rate).
"""
platform = "custom_facility_018103"
def parse(self, html: str, url: str = "") -> ParseResult:
soup = BeautifulSoup(html, "lxml")
result = ParseResult(platform=self.platform, parser_name=self.__class__.__name__)
unit_elements = soup.find_all("div", class_="filtered-item")
if not unit_elements:
result.warnings.append("No div.filtered-item elements found on page")
return result
for el in unit_elements:
unit = self._parse_unit(el, url)
if unit is not None:
result.units.append(unit)
return result
def _parse_unit(self, el: Tag, url: str) -> UnitResult | None:
"""Parse a single unit from a div.filtered-item element."""
unit = UnitResult(url=url)
# --- Size ---
size_el = el.select_one(".filter-item-detail.size h5")
if size_el:
size_text = size_el.get_text(strip=True)
w, ln, sq = self.normalize_size(size_text)
meta: dict = {}
if w is not None:
meta["width"] = w
meta["length"] = ln
meta["sqft"] = sq
unit.size = size_text
if meta:
unit.metadata = meta
# --- Description (location / unit type) ---
desc_el = el.select_one(".filter-item-detail.size .text-size-tiny-15")
if desc_el:
unit.description = desc_el.get_text(strip=True)
# --- Pricing ---
# Sale/web price: h5[id^="price-"]
sale_price_el = el.find("h5", id=lambda i: i and i.startswith("price-"))
if sale_price_el:
unit.sale_price = self.normalize_price(sale_price_el.get_text(strip=True))
# Regular/street price: h5[id^="slashed-price-"]
regular_price_el = el.find("h5", id=lambda i: i and i.startswith("slashed-price-"))
if regular_price_el:
unit.price = self.normalize_price(regular_price_el.get_text(strip=True))
# --- Promotion ---
promo_el = el.find(id=lambda i: i and i.startswith("promo-center-"))
if promo_el:
promo_text = promo_el.get_text(strip=True)
if promo_text:
unit.promotion = promo_text
# --- Availability ---
avail_el = el.select_one(".available-count span")
if avail_el:
avail_text = avail_el.get_text(strip=True)
if avail_text:
unit.scarcity = avail_text
# --- Amenities ---
combined = ((unit.description or "") + " " + (unit.size or "")).lower()
meta = unit.metadata or {}
if any(kw in combined for kw in ["drive up", "drive-up", "driveup"]):
meta["driveUpAccess"] = True
if any(kw in combined for kw in ["climate", "heated", "cooled", "temperature"]):
meta["climateControlled"] = True
if any(kw in combined for kw in ["indoor", "interior"]):
meta["indoor"] = True
if meta:
unit.metadata = meta
# Skip elements where no size was detected
if not unit.size:
return None
return unit
Scrape Runs (4)
-
exported Run #14502026-03-23 03:16:50.689030 | 9 units | Facility018103Parser | View Data →
-
exported Run #9572026-03-21 19:09:38.154014 | 9 units | Facility018103Parser | View Data →
-
exported Run #5102026-03-14 16:52:36.876312 | 9 units | Facility018103Parser | View Data →
-
exported Run #1082026-03-14 01:03:51.310154 | 9 units | Facility018103Parser | View Data →
Run #1450 Details
- Status
- exported
- Parser Used
- Facility018103Parser
- Platform Detected
- storageunitsoftware
- Units Found
- 9
- Stage Reached
- exported
- Timestamp
- 2026-03-23 03:16:50.689030
Timing
| Stage | Duration |
|---|---|
| Fetch | 5578ms |
| Detect | 65ms |
| Parse | 44ms |
| Export | 7ms |
Snapshot: 018103_20260323T031656Z.html · Show Snapshot · Open in New Tab
Parsed Units (9)
10x12
$40.00/mo
Street: $80.00
Unavailable
12x10
$42.50/mo
Street: $85.00
Unavailable
12x11
$45.00/mo
Street: $90.00
Unavailable
12x12
$47.50/mo
Street: $95.00
Unavailable
10x20
$60.00/mo
Street: $120.00
Available
11x23
$75.00/mo
Street: $150.00
Unavailable
11x25
$80.00/mo
Street: $160.00
Available
12x26
$85.00/mo
Street: $170.00
Unavailable
12x36
$95.00/mo
Street: $190.00
Unavailable