JSONPath Online logojsonpath.online
60+ XPath examples · Copy-ready

XPath Examples Library

Copy-ready XPath examples grouped by use case: basic selection, attributes, text, axes, functions, Selenium patterns, and web scraping scenarios. Click “Try it” to load each pattern in the playground with its HTML snippet.

Basic Selection

6 examples

Basic Selection

//div

Selects every div element.

Preview: <div class="container">…</div>

HTML snippet
<div class="container">
  <p>First paragraph</p>
  <p>Second paragraph</p>
</div>
Try it

Basic Selection

//div/p

Only paragraphs that are direct children of div.

Preview: <p>First paragraph</p>

HTML snippet
<div class="container">
  <p>First paragraph</p>
  <p>Second paragraph</p>
</div>
Try it

Basic Selection

//div//p

Paragraphs under div at any depth.

Preview: <p>Second paragraph</p>

HTML snippet
<div class="container">
  <p>First paragraph</p>
  <p>Second paragraph</p>
</div>
Try it

Basic Selection

/html/body/div[1]

The first div in the body.

Preview: <div id="one"></div>

HTML snippet
<body><div id="one"></div><div id="two"></div></body>
Try it

Basic Selection

//div[@id='main']

Matches a div whose id is main.

Preview: <div id="main"></div>

HTML snippet
<div id="main"></div><div id="secondary"></div>
Try it

Basic Selection

//div[@class='item']

Class equals item (not contains).

Preview: <div class="item"></div>

HTML snippet
<div class="item"></div><div class="item active"></div>
Try it

Attributes

8 examples

Attributes

//input[@type='text']

Attribute equals text.

Preview: <input type="text" />

HTML snippet
<input type="text" /><input type="email" />
Try it

Attributes

//div[contains(@class, 'btn')]

Substring check for class values.

Preview: <div class="btn primary"></div>

HTML snippet
<div class="btn primary"></div><div class="card"></div>
Try it

Attributes

//a[starts-with(@href, 'https')]

Secure links only.

Preview: <a href="https://site.com">Secure</a>

HTML snippet
<a href="https://site.com">Secure</a><a href="/home">Home</a>
Try it

Attributes

//img[@alt and @src]

Images with both alt and src.

Preview: <img alt="logo" src="logo.png" />

HTML snippet
<img alt="logo" src="logo.png" /><img src="missing.png" />
Try it

Attributes

//div[@data-id='123']

Custom data attributes.

Preview: <div data-id="123"></div>

HTML snippet
<div data-id="123"></div><div data-id="456"></div>
Try it

Attributes

//*[@*]

Nodes that have at least one attribute.

Preview: <div class="box"></div>

HTML snippet
<div class="box"></div><span>No attr</span>
Try it

Attributes

//div[not(@class)]

Div elements lacking class.

Preview: <div></div>

HTML snippet
<div></div><div class="has"></div>
Try it

Attributes

//input[@disabled]

Boolean attribute presence.

Preview: <input disabled />

HTML snippet
<input disabled /><input />
Try it

Text Selection

6 examples

Text Selection

//p[text()='Login']

Match exact text in a <p> tag.

Preview: <p>Login</p>

HTML snippet
<p>Login</p><p>Logout</p>
Try it

Text Selection

//p[contains(text(), 'Welcome')]

Substring search on text nodes.

Preview: <p>Welcome back</p>

HTML snippet
<p>Welcome back</p><p>Hello</p>
Try it

Text Selection

//div[normalize-space()='Submit']

Ignore surrounding whitespace.

Preview: <div> Submit </div>

HTML snippet
<div> Submit </div><div>Cancel</div>
Try it

Text Selection

//*[text()]

Elements that contain text nodes.

Preview: <span>Label</span>

HTML snippet
<span>Label</span><div><b>Bold</b></div>
Try it

Text Selection

//div[not(text())]

Silent container divs.

Preview: <div></div>

HTML snippet
<div></div><div>Text</div>
Try it

Text Selection

//p[string-length(text()) > 10]

Text nodes longer than 10 chars.

Preview: <p>More than ten</p>

HTML snippet
<p>Short</p><p>More than ten</p>
Try it

Axes

10 examples

Axes

//div/parent::*

The parent of every div.

Preview: <section><div>Item</div></section>

HTML snippet
<section><div>Item</div></section>
Try it

Axes

//div/child::p

Child paragraphs of divs.

Preview: <p>One</p>

HTML snippet
<div><p>One</p><span>Two</span></div>
Try it

Axes

//div/following-sibling::p

Next paragraphs after divs.

Preview: <p>Next</p>

HTML snippet
<div></div><p>Next</p>
Try it

Axes

//div/preceding-sibling::p

Paragraphs before a div.

Preview: <p>Before</p>

HTML snippet
<p>Before</p><div></div>
Try it

Axes

//div/ancestor::section

Section ancestors of div.

Preview: <section><div></div></section>

HTML snippet
<section><div></div></section>
Try it

Axes

//div/descendant::span

Spans under div.

Preview: <span>Hi</span>

HTML snippet
<div><p><span>Hi</span></p></div>
Try it

Axes

//div/following::*[1]

Immediate following node.

Preview: <p>After</p>

HTML snippet
<div></div><p>After</p><p>Later</p>
Try it

Axes

//div/preceding::*[1]

Immediate node before div.

Preview: <p>Before</p>

HTML snippet
<p>Before</p><div></div>
Try it

Axes

//li/ancestor-or-self::ul

Lists that contain li or li itself.

Preview: <ul><li>Item</li></ul>

HTML snippet
<ul><li>Item</li></ul>
Try it

Axes

//input/parent::*/following-sibling::label

Labels next to input parents.

Preview: <label for="i">Email</label>

HTML snippet
<div><input id="i" /></div><label for="i">Email</label>
Try it

Functions

12 examples

Functions

//div[count(p) > 2]

Div elements with more than 2 p children.

Preview: <div>…3 p elements…</div>

HTML snippet
<div><p>a</p><p>b</p><p>c</p></div>
Try it

Functions

//p[position() = 1]

First paragraph in each context.

Preview: <p>First</p>

HTML snippet
<p>First</p><p>Second</p>
Try it

Functions

//p[last()]

Last paragraph sibling.

Preview: <p>Last</p>

HTML snippet
<p>First</p><p>Last</p>
Try it

Functions

//div[name() = 'div']

Name() function usage.

Preview: <div></div>

HTML snippet
<div></div>
Try it

Functions

//div[local-name() = 'div']

Local-name demonstration.

Preview: <div></div>

HTML snippet
<div></div>
Try it

Functions

//p[string-length(text()) > 10]

Text longer than 10 characters.

Preview: <p>more than ten</p>

HTML snippet
<p>short</p><p>more than ten</p>
Try it

Functions

//div[concat(@class, '-suffix')]

Concat returns non-empty string so condition truthy.

Preview: <div class="box"></div>

HTML snippet
<div class="box"></div>
Try it

Functions

//p[substring(text(), 1, 5) = 'Hello']

Substring match at start.

Preview: <p>Hello world</p>

HTML snippet
<p>Hello world</p><p>Welcome</p>
Try it

Functions

//div[translate(@class, 'ABC', 'abc')]

Normalize class casing.

Preview: <div class="ABC"></div>

HTML snippet
<div class="ABC"></div>
Try it

Functions

//input[number(@value) > 100]

Numeric comparison on attribute.

Preview: <input value="120" />

HTML snippet
<input value="120" /><input value="50" />
Try it

Functions

//div[boolean(@data-active)]

Truthy data-active attribute.

Preview: <div data-active="true"></div>

HTML snippet
<div data-active="true"></div><div></div>
Try it

Functions

//p[normalize-space(text())]

Paragraphs with non-empty text after trimming.

Preview: <p> hi </p>

HTML snippet
<p>  hi </p><p>   </p>
Try it

Selenium Common Patterns

15 examples

Selenium Common Patterns

//button[text()='Submit']

Exact text button.

Preview: <button>Submit</button>

HTML snippet
<button>Submit</button><button>Cancel</button>
Try it

Selenium Common Patterns

//a[@href='/login']

Target login link.

Preview: <a href="/login">Login</a>

HTML snippet
<a href="/login">Login</a>
Try it

Selenium Common Patterns

//input[@name='username']

Form field by name.

Preview: <input name="username" />

HTML snippet
<input name="username" /><input name="password" />
Try it

Selenium Common Patterns

//table//tr[2]//td[3]

Second row, third cell.

Preview: <td>B3</td>

HTML snippet
<table><tr><td>A1</td></tr><tr><td>B1</td><td>B2</td><td>B3</td></tr></table>
Try it

Selenium Common Patterns

//ul[@class='menu']/li[last()]

Last list item.

Preview: <li>Three</li>

HTML snippet
<ul class="menu"><li>One</li><li>Two</li><li>Three</li></ul>
Try it

Selenium Common Patterns

//div[contains(@class, 'error') and contains(@class, 'visible')]

Error and visible flags.

Preview: <div class="error visible"></div>

HTML snippet
<div class="error visible"></div>
Try it

Selenium Common Patterns

//button[@type='submit' or @class='submit-btn']

Match either submit type or class.

Preview: <button class="submit-btn">Go</button>

HTML snippet
<button class="submit-btn">Go</button>
Try it

Selenium Common Patterns

//*[@id='main']//p[not(@class)]

Paragraphs inside main without class.

Preview: <p>Clean</p>

HTML snippet
<div id="main"><p>Clean</p><p class="muted">Muted</p></div>
Try it

Selenium Common Patterns

//div[@data-test-id='login-form']//input

Inputs inside login form container.

Preview: <input />

HTML snippet
<div data-test-id="login-form"><input /><input /></div>
Try it

Selenium Common Patterns

//iframe[@name='content']//*

Any node inside iframe.

Preview: <p>Hi</p>

HTML snippet
<iframe name="content"><html><body><p>Hi</p></body></html></iframe>
Try it

Selenium Common Patterns

//select[@name='country']/option[@selected]

Currently selected option.

Preview: <option selected>CA</option>

HTML snippet
<select name="country"><option>US</option><option selected>CA</option></select>
Try it

Selenium Common Patterns

//input[@type='checkbox' and @checked]

Checked boxes.

Preview: <input type="checkbox" checked />

HTML snippet
<input type="checkbox" checked /><input type="checkbox" />
Try it

Selenium Common Patterns

//div[starts-with(@id, 'dynamic-')]

IDs generated dynamically.

Preview: <div id="dynamic-123"></div>

HTML snippet
<div id="dynamic-123"></div><div id="static"></div>
Try it

Selenium Common Patterns

//span[contains(text(), 'Error') and @class='msg']

Error messages with class msg.

Preview: <span class="msg">Error occurred</span>

HTML snippet
<span class="msg">Error occurred</span>
Try it

Selenium Common Patterns

//*[text()='Next']/parent::button

Locate a parent button from text.

Preview: <button><span>Next</span></button>

HTML snippet
<button><span>Next</span></button>
Try it

Web Scraping

5 examples

Web Scraping

//article//h2/text()

Extract article titles without tags.

Preview: Text nodes are handy when scraping.

HTML snippet
<article><h2>Headline</h2><p>Story</p></article>
Try it

Web Scraping

//a[@rel='nofollow']/@href

Grab outbound or promo links.

Preview: Attributes can be returned directly.

HTML snippet
<a href="/promo" rel="nofollow">Promo</a>
Try it

Web Scraping

//div[not(contains(@class,'ad'))]//img/@src

Skip ad slots while collecting images.

Preview: Combine not() with contains().

HTML snippet
<div class="ad"><img src="ad.png"></div><div class="post"><img src="hero.jpg"></div>
Try it

Web Scraping

//ul[@class='products']/li[position()<=3]

Top 3 items only.

Preview: Position filtering keeps results small.

HTML snippet
<ul class="products"><li>A</li><li>B</li><li>C</li><li>D</li></ul>
Try it

Web Scraping

//meta[@property='og:title']/@content

Grab Open Graph title for previews.

Preview: Meta tags are attributes only.

HTML snippet
<meta property="og:title" content="Demo" />
Try it