4.9 KiB
IRW Website HTML Structure Reference
Restaurant Page URL
Live: https://inlanderrestaurantweek.com/project/SLUG/
Archived: https://web.archive.org/web/TIMESTAMP/https://inlanderrestaurantweek.com/project/SLUG/
Page Framework
The site uses WordPress + Divi theme. Relevant container class: et_pb_text_inner.
Each course section typically occupies one or two et_pb_text_inner divs.
Course Layout Types
Layout A — Heading and items in SEPARATE divs (most restaurants)
<div class="et_pb_text_inner"><h3>First Course</h3></div>
<div class="et_pb_text_inner">
<p><strong>Dish Name</strong><br/>Description</p>
<p><strong>Dish Name 2</strong><br/>Description 2</p>
</div>
<div class="et_pb_text_inner"><h3>Second Course</h3></div>
...
Layout B — Heading and items in SAME div (tavolata, durkins, table13, others)
<div class="et_pb_text_inner">
<h3>First Course</h3>
<p><strong>Dish Name</strong><br/>Description</p>
<p><strong>Dish Name 2</strong><br/>Description 2</p>
</div>
<div class="et_pb_text_inner">
<h3>Second Course</h3>
...
</div>
Dish Name Tag Styles
Style 1 — <strong> tag (most restaurants)
Examples: 315cuisine, anthonys, bardenay, barkrescuepub, etc.
<p><strong>Dish Name</strong><br/>Description text here</p>
<p><strong>Dish Name</strong> <br/>With space before br</p>
Style 2 — <b> tag with <br/> inside (India House, Lebanon, Karma, ponderosa)
<p><b>Dish Name <br/></b><span>Description text</span></p>
<p><b>Dish Name<br/></b> Description without span</p>
Key: name is inside <b>, the <br/> is INSIDE the <b> tag.
Style 3 — <b> + <strong> combo (1898 restaurant)
<p><span><b>First Part</b></span><strong>Second Part</strong> Description</p>
Full dish name = "First Part" + " " + "Second Part"
Field Extraction Patterns
Name (from page title)
<title>Restaurant Name | Inlander Restaurant Week</title>
Regex: <title>(.+?) \| Inlander
Price (WARNING: unreliable — use price listing page instead)
<h1 style="text-align: left;"><strong>$45</strong></h1>
Regex: <strong>\$(\d+)</strong>
PROBLEM: Some pages show drink prices like $22 that match before the real price.
SOLUTION: Always build an authoritative slug→price map from the price listing page.
Price Listing Page — Authoritative Prices
URL: https://inlanderrestaurantweek.com/price/ (or Wayback archived version)
<article class="et_pb_portfolio_item ... project_category_45 ...">
...
<a href="https://inlanderrestaurantweek.com/project/SLUG/">
Extract price tier from project_category_(25|35|45) CSS class.
Extract slug from href=".../project/SLUG/".
Cuisine
CUISINE: AMERICAN COMFORT FOOD
Often inside <strong> or <em> tags. Extract uppercase text after "CUISINE:".
Apply .ToTitleCase() for proper formatting.
Phone
Area codes: 509 (Spokane area) or 208 (Idaho/CDA area)
Pattern: (509) 555-1234 or (208) 555-1234
Regex: \((?:208|509)\) \d{3}-\d{4}
Hours
Menu served 5pm-9pm nightly
Menu served Thursday-Sunday, 5-9pm
Regex: Menu served [^<]+
Area
Look for area keywords (ALL CAPS in source) anywhere in the HTML:
- DOWNTOWN, NORTH SPOKANE, SOUTH SPOKANE, WEST SPOKANE, SPOKANE VALLEY
- AIRWAY HEIGHTS, LIBERTY LAKE, COEUR D'ALENE, POST FALLS, HAYDEN, ATHOL, WORLEY Default to ["Downtown"] if nothing matched. Some restaurants appear in multiple areas — collect all matches.
Dietary Tag Filtering
Skip these as dish names — they appear in <strong> but are dietary labels, not dish names:
- GF (gluten free)
- GFA (gluten free available)
- V, V+ (vegetarian, vegan)
- DF, DFA (dairy free, dairy free available)
- V:, V+A (legend lines)
- 2025 (year marker some restaurants include)
- Drink (some restaurants label beverage course)
Full regex: ^(GF|GFA|V\+?|DF|DFA|V:|2025|Drink|V\+A)$
Also skip names matching ^[A-Z]{1,3}: (legend lines like "GF: Gluten Free")
Also skip names shorter than 3 chars or longer than 80 chars.
Restaurants by Known HTML Style (2025)
Layout B (same-block): tavolata, durkins, table13, terraza, and others
Style 2 (<b> tags): indiahouse, lebanon, karma, ponderosa, collectivekitchen, dryfly, masselowslounge, vieuxcarre, wileys, osprey, shawnodonnells, ganderryegrass
Style 3 (<b>+<strong> combo): 1898
Note: These styles may change year to year as restaurants update their pages. Always check a few representative pages before assuming the same structure applies.
JS-Only Pages (no static HTML menu content)
These restaurants had no recoverable menu data from any Wayback snapshot in 2025: heritage, kismet, littlenoodle, macdaddys, purgatory, redtail, republickitchen, republicpi, vicinopizza
Their pages are fully JS-rendered — the static HTML captured by Wayback Machine shows the page shell but not the menu content. For future years, these may or may not have static caches depending on server-side rendering changes.