Facility: 015869
Hilltop Storage
- 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 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)
-
exported Run #14432026-03-23 03:16:24.411689 | 3 units | Facility015869Parser | View Data →
-
exported Run #9502026-03-21 19:09:10.937225 | 3 units | Facility015869Parser | View Data →
-
exported Run #5032026-03-14 16:51:51.385359 | 3 units | Facility015869Parser | View Data →
-
failed Run #1722026-03-14 05:03:09.562440 | 1 failure(s)
-
failed Run #1712026-03-14 05:02:09.540925 | 1 failure(s)
-
failed Run #1702026-03-14 05:01:19.515190 | 1 failure(s)
-
failed Run #1692026-03-14 05:00:49.491953 | 1 failure(s)
-
exported Run #922026-03-14 01:02:25.797651 | 3 units | Facility015869Parser | View Data →
Run #170 Details
- Status
- failed
- Parser Used
- N/A
- Platform Detected
- N/A
- Units Found
- 0
- Stage Reached
- fetch
- Timestamp
- 2026-03-14 05:01:19.515190
Failures (1)
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>
All Failures for this Facility (4)
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>
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>
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>
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>