Build complicated XPath queries without the hassle - JavaScript & Python
A chainable API to build complex XPath queries along the different XPath axes. Available both in Python and JavaScript.
Documentation — Consult the quick start guide and the online documentation.
Installation¶
JavaScript¶
xpath-helper
can be installed using npm:
npm install xpath-helper
Python¶
xpath-helper
requires python 3.5+ and can be installed using pip:
pip install xpath-helper
Quick-start¶
You can chain method call on the different XPath axes and easily add filters.
JavaScript¶
import { xh, filter } from 'xpath-helper';
// Finds a paragraph <p> containing a CSS class 'very-nice-p'
const p = xh.getElementByTag('p', filter.attributeContains('class', 'very-nice-p'));
p.toString() // "//p[contains(@class, 'very-nice-p')]"
// Finds the paragraph that is following the above one
const nextP = p.getFollowingSiblingByTag('p');
nextP.toString() // "//p[contains(@class, 'very-nice-p')]/following-sibling::p"
// Finds the modal containing a button with text "Register"
const modal = xh.getElement(filter.valueEquals('Register'))
.getAncestor(filter.attributeEquals('class', 'modal'));
modal.toString() // "//*[text() = 'Register']/ancestor::*[@class='modal']"
// An elaborated filter with a boolean expression
const li = xh.getElementByTag("li",
filter.and(
filter.or(
filter.valueContains("JavaScript"), filter.valueContains("Python")
),
filter.hasAttribute("data-description")
));
li.toString() // "//li[((text()[contains(., 'JavaScript')] or text()[contains(., 'Python')]) and @data-description)]"
See the JavaScript documentation for more details.
Python¶
from xpath_helper import xh, filter
# Finds a paragraph <p> containing a CSS class 'very-nice-p'
p = xh.get_element_by_tag('p', filter.attribute_contains('class', 'very-nice-p'))
str(p) # "//p[contains(@class, 'very-nice-p')]"
# Finds the paragraph that is following the above one
next_p = p.get_following_sibling_by_tag('p')
str(next_p) # "//p[contains(@class, 'very-nice-p')]/following-sibling::p"
# Finds the modal containing a button with text "Register"
modal = xh.get_element(
filter.value_equals('Register')
).get_ancestor(
filter.attribute_equals('class', 'modal')
)
str(modal) # "//*[text() = 'Register']/ancestor::*[@class='modal']"
# An elaborated filter with a boolean expression
li = xh.get_element_by_tag("li", filter.and_operator(
filter.or_operator(
filter.value_contains("JavaScript"), filter.value_contains("Python")
),
filter.has_attribute("data-description")
))
str(li) # "//li[((text()[contains(., 'JavaScript')] or text()[contains(., 'Python')]) and @data-description)]"
See the Python documentation for more details.
License¶
xpath-helper
is released under the MIT license.