Facility: 015869

Hilltop Storage

Stale Data Warning: This facility has not been successfully scraped in 30 days (threshold: 3 days). Data may be outdated.
Facility Information active
Facility ID
015869
Name
Hilltop Storage
URL
http://www.hilltopstorage.com/
Address
N/A
Platform
custom_facility_015869
Parser File
src/parsers/custom/facility_015869_parser.py
Last Scraped
2026-03-23 03:16:28.601734
Created
2026-03-06 23:45:35.865957
Updated
2026-03-23 03:16:28.609594
Parser & Healing Diagnosis working
Parser Status
✓ Working
Status Reason
N/A
Last Healing Attempt
Not attempted
Parser Source (src/parsers/custom/facility_015869_parser.py)
"""Parser for Hilltop Storage, LLC facility.

This is a Squarespace site that lists storage unit types as list items.
Each item title contains the size and price in the format:
    "Our 6x12 Units ($45/month)"
"""

from __future__ import annotations

import re

from bs4 import BeautifulSoup

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


class Facility015869Parser(BaseParser):
    """Extract storage units from Hilltop Storage, LLC.

    Units are displayed as Squarespace list items with titles like:
        Our 6x12 Units ($45/month)
        Our 12x12 Units ($70/month)
        Our 24x12 Units ($120/month)
    """

    platform = "custom_facility_015869"

    # Pattern: "Our {W}x{L} Units (${price}/month)"
    _TITLE_RE = re.compile(
        r"Our\s+(\d+)[xX](\d+)\s+Units?\s+\(\$"
        r"([\d,]+(?:\.\d+)?)"
        r"(?:/mo(?:nth)?)?\)",
        re.IGNORECASE,
    )

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

        # Find all Squarespace list-item titles
        titles = soup.find_all("h2", class_="list-item-content__title")

        for title_tag in titles:
            title_text = title_tag.get_text(strip=True)
            match = self._TITLE_RE.search(title_text)
            if not match:
                continue

            width = int(match.group(1))
            length = int(match.group(2))
            price_str = match.group(3).replace(",", "")
            price = float(price_str)

            # Grab description from the sibling description div
            description = ""
            content_wrapper = title_tag.find_parent("div", class_="list-item-content__text-wrapper")
            if content_wrapper:
                desc_div = content_wrapper.find("div", class_=re.compile(r"list-item-content__description"))
                if desc_div:
                    description = desc_div.get_text(strip=True)

            unit = UnitResult(
                size=self.normalize_size(f"{width}x{length}"),
                price=price,
                description=description or title_text,
                metadata={"width": width, "length": length, "sqft": width * length},
            )
            result.units.append(unit)

        if not result.units:
            result.warnings.append("No unit list items matched the expected title pattern")

        return result

Scrape Runs (8)

Run #503 Details

Status
exported
Parser Used
Facility015869Parser
Platform Detected
table_layout
Units Found
3
Stage Reached
exported
Timestamp
2026-03-14 16:51:51.385359
Timing
Stage Duration
Fetch4101ms
Detect12ms
Parse6ms
Export14ms

Snapshot: 015869_20260314T165155Z.html · Show Snapshot · Open in New Tab

Parsed Units (3)

(6.0,12.0,72.0)

$45.00/mo

(12.0,12.0,144.0)

$70.00/mo

(24.0,12.0,288.0)

$120.00/mo

All Failures for this Facility (4)

fetch TimeoutException website timeout transient Run #172 | 2026-03-14 05:03:39.576826

Message: timeout: Timed out receiving message from renderer: 29.840 (Session info: chrome=146.0.7680.71) Stacktrace: #0 0x561925b8c77e <unknown> #1 0x56192554a1d2 <unknown> #2 0x5619255351fc <unknown> #3 0x561925534fe9 <unknown> #4 0x5619255335e6 <unknown> #5 0x561925533a96 <unknown> #6 0x5619255420f7 <unknown> #7 0x56192555777d <unknown> #8 0x56192555d02b <unknown> #9 0x5619255340a1 <unknown> #10 0x5619255575bf <unknown> #11 0x5619255d9b79 <unknown> #12 0x5619255b9a03 <unknown> #13 0x56192558a5d5 <unknown> #14 0x56192558b1c1 <unknown> #15 0x561925b50dc0 <unknown> #16 0x561925b54088 <unknown> #17 0x561925b53b3a <unknown> #18 0x561925b544f5 <unknown> #19 0x561925b407ab <unknown> #20 0x561925b54857 <unknown> #21 0x561925b287c6 <unknown> #22 0x561925b79755 <unknown> #23 0x561925b7994c <unknown> #24 0x561925b8b23a <unknown> #25 0x7fa821e561f5 <unknown>

Stack trace
Traceback (most recent call last):
  File "/app/src/pipeline.py", line 361, in _process_facility
    fetch_result = fetch_page(driver, url, snapshot_mgr, facility_id, **fetch_kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/src/fetcher/fetcher.py", line 125, in fetch_page
    driver.get(url)
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 466, in get
    self.execute(Command.GET, {"url": url})
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 446, in execute
    self.error_handler.check_response(response)
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 232, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 29.840
  (Session info: chrome=146.0.7680.71)
Stacktrace:
#0 0x561925b8c77e <unknown>
#1 0x56192554a1d2 <unknown>
#2 0x5619255351fc <unknown>
#3 0x561925534fe9 <unknown>
#4 0x5619255335e6 <unknown>
#5 0x561925533a96 <unknown>
#6 0x5619255420f7 <unknown>
#7 0x56192555777d <unknown>
#8 0x56192555d02b <unknown>
#9 0x5619255340a1 <unknown>
#10 0x5619255575bf <unknown>
#11 0x5619255d9b79 <unknown>
#12 0x5619255b9a03 <unknown>
#13 0x56192558a5d5 <unknown>
#14 0x56192558b1c1 <unknown>
#15 0x561925b50dc0 <unknown>
#16 0x561925b54088 <unknown>
#17 0x561925b53b3a <unknown>
#18 0x561925b544f5 <unknown>
#19 0x561925b407ab <unknown>
#20 0x561925b54857 <unknown>
#21 0x561925b287c6 <unknown>
#22 0x561925b79755 <unknown>
#23 0x561925b7994c <unknown>
#24 0x561925b8b23a <unknown>
#25 0x7fa821e561f5 <unknown>

fetch TimeoutException website timeout transient Run #171 | 2026-03-14 05:02:39.555512

Message: timeout: Timed out receiving message from renderer: 29.825 (Session info: chrome=146.0.7680.71) Stacktrace: #0 0x561925b8c77e <unknown> #1 0x56192554a1d2 <unknown> #2 0x5619255351fc <unknown> #3 0x561925534fe9 <unknown> #4 0x5619255335e6 <unknown> #5 0x561925533a96 <unknown> #6 0x5619255420f7 <unknown> #7 0x56192555777d <unknown> #8 0x56192555d02b <unknown> #9 0x5619255340a1 <unknown> #10 0x5619255575bf <unknown> #11 0x5619255d9b79 <unknown> #12 0x5619255b9a03 <unknown> #13 0x56192558a5d5 <unknown> #14 0x56192558b1c1 <unknown> #15 0x561925b50dc0 <unknown> #16 0x561925b54088 <unknown> #17 0x561925b53b3a <unknown> #18 0x561925b544f5 <unknown> #19 0x561925b407ab <unknown> #20 0x561925b54857 <unknown> #21 0x561925b287c6 <unknown> #22 0x561925b79755 <unknown> #23 0x561925b7994c <unknown> #24 0x561925b8b23a <unknown> #25 0x7fa821e561f5 <unknown>

Stack trace
Traceback (most recent call last):
  File "/app/src/pipeline.py", line 361, in _process_facility
    fetch_result = fetch_page(driver, url, snapshot_mgr, facility_id, **fetch_kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/src/fetcher/fetcher.py", line 125, in fetch_page
    driver.get(url)
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 466, in get
    self.execute(Command.GET, {"url": url})
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 446, in execute
    self.error_handler.check_response(response)
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 232, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 29.825
  (Session info: chrome=146.0.7680.71)
Stacktrace:
#0 0x561925b8c77e <unknown>
#1 0x56192554a1d2 <unknown>
#2 0x5619255351fc <unknown>
#3 0x561925534fe9 <unknown>
#4 0x5619255335e6 <unknown>
#5 0x561925533a96 <unknown>
#6 0x5619255420f7 <unknown>
#7 0x56192555777d <unknown>
#8 0x56192555d02b <unknown>
#9 0x5619255340a1 <unknown>
#10 0x5619255575bf <unknown>
#11 0x5619255d9b79 <unknown>
#12 0x5619255b9a03 <unknown>
#13 0x56192558a5d5 <unknown>
#14 0x56192558b1c1 <unknown>
#15 0x561925b50dc0 <unknown>
#16 0x561925b54088 <unknown>
#17 0x561925b53b3a <unknown>
#18 0x561925b544f5 <unknown>
#19 0x561925b407ab <unknown>
#20 0x561925b54857 <unknown>
#21 0x561925b287c6 <unknown>
#22 0x561925b79755 <unknown>
#23 0x561925b7994c <unknown>
#24 0x561925b8b23a <unknown>
#25 0x7fa821e561f5 <unknown>

fetch TimeoutException website timeout transient Run #170 | 2026-03-14 05:01:54.533821

Message: timeout: Timed out receiving message from renderer: 29.844 (Session info: chrome=146.0.7680.71) Stacktrace: #0 0x561925b8c77e <unknown> #1 0x56192554a1d2 <unknown> #2 0x5619255351fc <unknown> #3 0x561925534fe9 <unknown> #4 0x5619255335e6 <unknown> #5 0x561925533a96 <unknown> #6 0x5619255420f7 <unknown> #7 0x56192555777d <unknown> #8 0x56192555d02b <unknown> #9 0x5619255340a1 <unknown> #10 0x5619255575bf <unknown> #11 0x5619255d9b79 <unknown> #12 0x5619255b9a03 <unknown> #13 0x56192558a5d5 <unknown> #14 0x56192558b1c1 <unknown> #15 0x561925b50dc0 <unknown> #16 0x561925b54088 <unknown> #17 0x561925b53b3a <unknown> #18 0x561925b544f5 <unknown> #19 0x561925b407ab <unknown> #20 0x561925b54857 <unknown> #21 0x561925b287c6 <unknown> #22 0x561925b79755 <unknown> #23 0x561925b7994c <unknown> #24 0x561925b8b23a <unknown> #25 0x7fa821e561f5 <unknown>

Stack trace
Traceback (most recent call last):
  File "/app/src/pipeline.py", line 361, in _process_facility
    fetch_result = fetch_page(driver, url, snapshot_mgr, facility_id, **fetch_kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/src/fetcher/fetcher.py", line 125, in fetch_page
    driver.get(url)
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 466, in get
    self.execute(Command.GET, {"url": url})
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 446, in execute
    self.error_handler.check_response(response)
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 232, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 29.844
  (Session info: chrome=146.0.7680.71)
Stacktrace:
#0 0x561925b8c77e <unknown>
#1 0x56192554a1d2 <unknown>
#2 0x5619255351fc <unknown>
#3 0x561925534fe9 <unknown>
#4 0x5619255335e6 <unknown>
#5 0x561925533a96 <unknown>
#6 0x5619255420f7 <unknown>
#7 0x56192555777d <unknown>
#8 0x56192555d02b <unknown>
#9 0x5619255340a1 <unknown>
#10 0x5619255575bf <unknown>
#11 0x5619255d9b79 <unknown>
#12 0x5619255b9a03 <unknown>
#13 0x56192558a5d5 <unknown>
#14 0x56192558b1c1 <unknown>
#15 0x561925b50dc0 <unknown>
#16 0x561925b54088 <unknown>
#17 0x561925b53b3a <unknown>
#18 0x561925b544f5 <unknown>
#19 0x561925b407ab <unknown>
#20 0x561925b54857 <unknown>
#21 0x561925b287c6 <unknown>
#22 0x561925b79755 <unknown>
#23 0x561925b7994c <unknown>
#24 0x561925b8b23a <unknown>
#25 0x7fa821e561f5 <unknown>

fetch TimeoutException website timeout transient Run #169 | 2026-03-14 05:01:19.506349

Message: timeout: Timed out receiving message from renderer: 29.822 (Session info: chrome=146.0.7680.71) Stacktrace: #0 0x561925b8c77e <unknown> #1 0x56192554a1d2 <unknown> #2 0x5619255351fc <unknown> #3 0x561925534fe9 <unknown> #4 0x5619255335e6 <unknown> #5 0x561925533a96 <unknown> #6 0x5619255420f7 <unknown> #7 0x56192555777d <unknown> #8 0x56192555d02b <unknown> #9 0x5619255340a1 <unknown> #10 0x5619255575bf <unknown> #11 0x5619255d9b79 <unknown> #12 0x5619255b9a03 <unknown> #13 0x56192558a5d5 <unknown> #14 0x56192558b1c1 <unknown> #15 0x561925b50dc0 <unknown> #16 0x561925b54088 <unknown> #17 0x561925b53b3a <unknown> #18 0x561925b544f5 <unknown> #19 0x561925b407ab <unknown> #20 0x561925b54857 <unknown> #21 0x561925b287c6 <unknown> #22 0x561925b79755 <unknown> #23 0x561925b7994c <unknown> #24 0x561925b8b23a <unknown> #25 0x7fa821e561f5 <unknown>

Stack trace
Traceback (most recent call last):
  File "/app/src/pipeline.py", line 361, in _process_facility
    fetch_result = fetch_page(driver, url, snapshot_mgr, facility_id, **fetch_kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/src/fetcher/fetcher.py", line 125, in fetch_page
    driver.get(url)
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 466, in get
    self.execute(Command.GET, {"url": url})
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 446, in execute
    self.error_handler.check_response(response)
  File "/app/.venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 232, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 29.822
  (Session info: chrome=146.0.7680.71)
Stacktrace:
#0 0x561925b8c77e <unknown>
#1 0x56192554a1d2 <unknown>
#2 0x5619255351fc <unknown>
#3 0x561925534fe9 <unknown>
#4 0x5619255335e6 <unknown>
#5 0x561925533a96 <unknown>
#6 0x5619255420f7 <unknown>
#7 0x56192555777d <unknown>
#8 0x56192555d02b <unknown>
#9 0x5619255340a1 <unknown>
#10 0x5619255575bf <unknown>
#11 0x5619255d9b79 <unknown>
#12 0x5619255b9a03 <unknown>
#13 0x56192558a5d5 <unknown>
#14 0x56192558b1c1 <unknown>
#15 0x561925b50dc0 <unknown>
#16 0x561925b54088 <unknown>
#17 0x561925b53b3a <unknown>
#18 0x561925b544f5 <unknown>
#19 0x561925b407ab <unknown>
#20 0x561925b54857 <unknown>
#21 0x561925b287c6 <unknown>
#22 0x561925b79755 <unknown>
#23 0x561925b7994c <unknown>
#24 0x561925b8b23a <unknown>
#25 0x7fa821e561f5 <unknown>

← Back to dashboard