yet another xpath generator
Create an xpath with an chainable and intuitive API.
Quickstart
Create the most simple xpath for a div element:
from yaxp import xpath
# //div
xpath.div
xpath objects are chainable:
# //div//h1
xpath.div.h1
Any keyword argument you pass will add a filter for an attribute with the name and value of the keyword:
# //div[@role="cell"]
xpath.div(role="cell")
Alternatively, use the by() method to specify attributes:
# //*[@class="main"]
xpath.by(_class="main")
An _ at the beginning of the attribute name will be
removed, this is helpful for attributes that represents
python keywords like "class" or "id":
# //div[@class="cell"][@id="myid"]
xpath.div(_class="cell", _id="myid")
If the value of an attribute starts with an asteric (*), the xpath matches
any element that has the following text as a substring in this attribute
# //div[contains(@class, 'mycl')]
xpath.div(_class="*mycl")
Alternatively, you can use the contains() function to filter for subtrings.
the following statement is equal to the above:
# //div[contains(@class, 'mycl')]
xpath.div.contains(_class="mycl")
xpath supports "nested predicates", i.e. you can filter for specific sub-elements, while the xpath itself will point to the parent element (div in this example):
# //div[./span[@class='mycl']]
xpath.div.has(xpath.span(_class="mycl"))
Nested predicates are chainable:
# //div[./span[@class='mycl'][./p[text()="hello"]]]
xpath.div.has(xpath.span(_class="mycl")).has(xpath.p(text="hello"))
As you can see in the example above, a text attribute will be converted to "text()". In order to avoid this, use "_":
# //p[@text="hello"]]]
xpath.p(_text="hello"))
An "_" attrbute will be converted to ".":
# //p[contains(., "world")]
xpath.p(_="*world")
If the value of an attribute starts with a hashtag (#), the xpath matches
any element that has the following text as a full word in this attribute:
# //div[contains(concat(' ', normalize-space(@class), ' '), ' myclass ')]
xpath.div(_class="#myclass")
Any combination of the features are allowed:
# //span[contains(@class, "mycl")][@placeholder="huhu"]
xpath.span(_class="*mycl", _placeholder='huhu')
An _ in the role will be converted to a ".":
# //Android.Container[@id="huhu"]
xp.Android_Container(_id="huhu")
Use double __ if you need an _:
# //Android_Container[@id="huhu"]
xp.Android__Container(_id="huhu")
Further reading
Metadata
Release files for yaxp 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| yaxp-1.0.1.tar.gz | 4.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yaxp-1.0.1-py2.py3-none-any.whl | Python 3, Python 2 | none | any | Details |
Total release size: 8.7 kB
Release files / yaxp-1.0.1.tar.gz
| Download URL | yaxp-1.0.1.tar.gz |
|---|---|
| Size | 4.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ba853b5dc949b10abff39937df78e78336e3d88ad8b2e3b240c30dbaf15f1559
|
|
BLAKE2b-256 checksum How to use checksums |
1154b89fa17863a86ea7fda19817ebca3344c11e9405d511b2f93d9ffabd24d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/5.0.0 CPython/3.12.3
|
Release files / yaxp-1.0.1-py2.py3-none-any.whl
| Download URL | yaxp-1.0.1-py2.py3-none-any.whl |
|---|---|
| Size | 4.1 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
26d7ca70b57dd6aadc0f3a682902330ae6ffcf5c359365fe997b3c67287d9e72
|
|
BLAKE2b-256 checksum How to use checksums |
91e0bc515d0ddeb269cd859aae4a9b0aceb63d6df58da4ad907f499ec19db842
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/5.0.0 CPython/3.12.3
|