Facility: 111937
Stuf Storage
- Facility ID
- 111937
- Name
- Stuf Storage
- URL
- https://www.stufstorage.com/new-york-units-near-me/self-storage-long-island-city-jackson-ave?utm_source=gmb&utm_medium=directories&utm_campaign=ny-lic-jackson
- Address
- 27-01 Jackson Ave, Long Island City, NY 11101, USA, Long Island City, New York 11101
- Platform
- custom_facility_111937
- Parser File
- src/parsers/custom/facility_111937_parser.py
- Last Scraped
- 2026-03-27 13:45:32.654524
- Created
- 2026-03-20 23:23:10.660695
- Updated
- 2026-03-27 13:45:32.681994
- Parser Status
- ✓ Working
- Status Reason
- N/A
- Last Healing Attempt
- Not attempted
Parser Source (src/parsers/custom/facility_111937_parser.py)
"""Parser for Stuf Storage (Long Island City - Jackson Ave)."""
from __future__ import annotations
import re
from bs4 import BeautifulSoup
from src.parsers.base import BaseParser, ParseResult, UnitResult
class Facility111937Parser(BaseParser):
"""Extract storage units from Stuf Storage using grid-cols-5 unit rows."""
platform = "custom_facility_111937"
def parse(self, html: str, url: str = "") -> ParseResult:
soup = BeautifulSoup(html, "lxml")
result = ParseResult(platform=self.platform, parser_name=self.__class__.__name__)
# Stuf Storage renders unit rows as div.grid-cols-5 elements
# Each row has: "Large (10 x 17) [availability]" | "$310.80 $444" | "promo text"
unit_rows = soup.find_all("div", class_=lambda c: c and "grid-cols-5" in c)
for row in unit_rows:
children = [c for c in row.children if hasattr(c, "get_text")]
if not children:
continue
unit = UnitResult()
# First child: "Large (10 x 17) 1 unit left" or "Small (0)"
if children:
label_text = children[0].get_text(separator=" ", strip=True)
# Extract dimension from parentheses
m = re.search(r"\((\d+\s*x\s*\d+)\)", label_text)
if m:
unit.size = m.group(1).strip()
w, ln, sq = self.normalize_size(unit.size)
if w is not None:
unit.metadata = {"width": w, "length": ln, "sqft": sq}
# Second child: "$310.80 $444" (current price then strikethrough)
if len(children) > 1:
price_text = children[1].get_text(separator=" ", strip=True)
# Extract the first dollar amount (the current price)
prices = re.findall(r"\$(\d+(?:\.\d+)?)", price_text)
if prices:
unit.price = float(prices[0])
if unit.size or unit.price:
result.units.append(unit)
if not result.units:
result.warnings.append("No units found on page")
return result
Scrape Runs (4)
-
exported Run #16772026-03-27 13:45:26.057861 | 2 units | Facility111937Parser | View Data →
-
exported Run #16762026-03-27 13:45:26.014708 | 2 units | Facility111937Parser | View Data →
-
exported Run #11002026-03-23 02:45:59.130427 | 1 units | Facility111937Parser | View Data →
-
exported Run #6062026-03-21 18:36:12.109390 | 2 units | Facility111937Parser | View Data →
Run #1100 Details
- Status
- exported
- Parser Used
- Facility111937Parser
- Platform Detected
- ccstorage
- Units Found
- 1
- Stage Reached
- exported
- Timestamp
- 2026-03-23 02:45:59.130427
Timing
| Stage | Duration |
|---|---|
| Fetch | 7105ms |
| Detect | 60ms |
| Parse | 27ms |
| Export | 4ms |
Snapshot: 111937_20260323T024606Z.html · Show Snapshot · Open in New Tab
Parsed Units (1)
10 x 17
$345.80/mo