This module contains XFind selectors and related classes and functions. A selector specifies a condition that a node in an XIST tree must satisfy to match the selector. For example the method ``Node.walk`` will only output nodes that match the specified selector. Selectors can be combined with various operations and form a language comparable to XPath but implemented as Python expressions. ========================================== def ``filter``​(``iter``, *``selectors``): ========================================== Filter an iterator over ``xsc.Cursor`` objects against a ``Selector`` object. Example: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> [c.node.string() for c in xfind.filter(doc.walk(), html.b, html.title)] [ 'Welcome to Python.org', 'Web Programming', 'GUI Development', 'Scientific and Numeric', 'Software Development', 'System Administration' ] ============================= def ``selector``​(*``objs``): ============================= Create a ``Selector`` object from ``objs``. If ``objs`` is empty (i.e. ``selector`` is called without arguments) ``any`` is returned (which matches every node). If more than one argument is passed (or the argument is a tuple), an ``OrCombinator`` is returned. Otherwise the following steps are taken for the single argument ``obj``: * if ``obj`` already is a ``Selector`` object it is returned unchanged; * if ``obj`` is a ``Node`` subclass, an ``IsInstanceSelector`` is returned (which matches if the node is an instance of this class); * if ``obj`` is a ``Node`` instance, an ``IsSelector`` is returned (which matches only ``obj``); * if ``obj`` is callable a ``CallableSelector`` is returned (where matching is done by calling ``obj``); * if ``obj`` is ``None`` ``any`` will be returned; * otherwise ``selector`` will raise a ``TypeError``. ================================ class ``Selector``​(``object``): ================================ A selector specifies a condition that a node in an XIST tree must satisfy to match the selector. Whether a node matches the selector can be specified by overwriting the ``__contains__`` method. Selectors can be combined with various operations (see methods below). def ``__contains__``​(``self``, *``args``, **``kwargs``): --------------------------------------------------------- Return whether ``path`` (which is a list of XIST nodes from the root of the tree to the node in question) matches the selector. def ``__truediv__``​(``self``, ``other``): ------------------------------------------ Create a ``ChildCombinator`` with ``self`` as the left hand selector and ``other`` as the right hand selector. def ``__floordiv__``​(``self``, ``other``): ------------------------------------------- Create a ``DescendantCombinator`` with ``self`` as the left hand selector and ``other`` as the right hand selector. def ``__mul__``​(``self``, ``other``): -------------------------------------- Create an ``AdjacentSiblingCombinator`` with ``self`` as the left hand selector and ``other`` as the right hand selector. def ``__pow__``​(``self``, ``other``): -------------------------------------- Create a ``GeneralSiblingCombinator`` with ``self`` as the left hand selector and ``other`` as the right hand selector. def ``__and__``​(``self``, ``other``): -------------------------------------- Create an ``AndCombinator`` from ``self`` and ``other``. def ``__or__``​(``self``, ``other``): ------------------------------------- Create an ``OrCombinator`` from ``self`` and ``other``. def ``__invert__``​(``self``): ------------------------------ Create a ``NotCombinator`` inverting ``self``. ===================================== class ``AnySelector``​(``Selector``): ===================================== Selector that selects all nodes. An instance of this class named ``any`` is created as a module global, i.e. you can use ``xfind.any``. def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__and__``​(``self``, ``other``): -------------------------------------- def ``__or__``​(``self``, ``other``): ------------------------------------- ============================================ class ``IsInstanceSelector``​(``Selector``): ============================================ Selector that selects all nodes that are instances of the specified type. You can either create an ``IsInstanceSelector`` object directly or simply pass a class to a function that expects a selector (this class will be automatically wrapped in an ``IsInstanceSelector``): >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(html.a): ... print(node.attrs.href, node.attrs.title) ... https://www.python.org/#content Skip to content https://www.python.org/#python-network https://www.python.org/ The Python Programming Language https://www.python.org/psf-landing/ The Python Software Foundation ... def ``__init__``​(``self``, *``types``): ---------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__or__``​(``self``, ``other``): ------------------------------------- def ``__getitem__``​(``self``, ``index``): ------------------------------------------ Return an ``nthoftype`` selector that uses ``index`` as the index and ``self.types`` as the types. def ``__str__``​(``self``): --------------------------- ================================= class ``element``​(``Selector``): ================================= Selector that selects all elements that have a specified namespace name and element name: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.element(html, "img")): ... print(node.string()) ... def ``__init__``​(``self``, ``xmlns``, ``xmlname``): ---------------------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ================================== class ``procinst``​(``Selector``): ================================== Selector that selects all processing instructions that have a specified name. def ``__init__``​(``self``, ``xmlname``): ----------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ================================ class ``entity``​(``Selector``): ================================ Selector that selects all entities that have a specified name. def ``__init__``​(``self``, ``xmlname``): ----------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ==================================== class ``IsSelector``​(``Selector``): ==================================== Selector that selects one specific node in the tree. This can be combined with other selectors via ``ChildCombinator`` or ``DescendantCombinator`` selectors to select children of this specific node. You can either create an ``IsSelector`` directly or simply pass a node to a function that expects a selector: >>> from ll.xist import xsc, parse >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(doc[0]/xsc.Element): ... print(repr(node)) ... def ``__init__``​(``self``, ``node``): -------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ======================================== class ``IsRootSelector``​(``Selector``): ======================================== Selector that selects the node that is the root of the traversal. An instance of this class named ``isroot`` is created as a module global, i.e. you can use ``xfind.isroot``. def ``__contains__``​(``self``, ``path``): ------------------------------------------ ========================================= class ``IsEmptySelector``​(``Selector``): ========================================= Selector that selects all empty elements or fragments. An instance of this class named ``empty`` is created as a module global, i.e. you can use ``xfind.empty``: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.empty): ... print(node.string()) ... ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ =========================================== class ``OnlyChildSelector``​(``Selector``): =========================================== Selector that selects all nodes that are the only child of their parents. An instance of this class named ``onlychild`` is created as a module global, i.e. you can use ``xfind.onlychild``: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.onlychild & html.a): ... print(node.string()) ... Smaller Larger Reset Google+ ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ============================================ class ``OnlyOfTypeSelector``​(``Selector``): ============================================ Selector that selects all nodes that are the only nodes of their type among their siblings. An instance of this class named ``onlyoftype`` is created as a module global, i.e. you can use ``xfind.onlyoftype``: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.onlyoftype & xsc.Element): ... print(repr(node)) ... ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ================================= class ``hasattr``​(``Selector``): ================================= Selector that selects all element nodes that have an attribute with one of the specified names. (Names can be strings, (attribute name, namespace name) tuples or attribute classes or instances): >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.hasattr("id")): ... print(node.xmlname, node.attrs.id) ... body homepage div touchnav-wrapper div top a close-python-network ... def ``__init__``​(``self``, *``attrnames``): -------------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ====================================== class ``attrhasvalue``​(``Selector``): ====================================== Selector that selects all element nodes where an attribute with the specified name has one of the specified values. (Names can be strings, (attribute name, namespace name) tuples or attribute classes or instances). Note that "fancy" attributes (i.e. those containing non-text) will not be considered: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.attrhasvalue("rel", "stylesheet")): ... print(node.attrs.href) ... https://www.python.org/static/stylesheets/style.css https://www.python.org/static/stylesheets/mq.css def ``__init__``​(``self``, ``attrname``, *``attrvalues``): ----------------------------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ====================================== class ``attrcontains``​(``Selector``): ====================================== Selector that selects all element nodes where an attribute with the specified name contains one of the specified substrings in its value. (Names can be strings, (attribute name, namespace name) tuples or attribute classes or instances). Note that "fancy" attributes (i.e. those containing non-text) will not be considered: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.attrcontains("rel", "stylesheet")): ... print(node.attrs.rel, node.attrs.href) ... stylesheet https://www.python.org/static/stylesheets/style.css stylesheet https://www.python.org/static/stylesheets/mq.css def ``__init__``​(``self``, ``attrname``, *``attrvalues``): ----------------------------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ======================================== class ``attrstartswith``​(``Selector``): ======================================== Selector that selects all element nodes where an attribute with the specified name starts with any of the specified strings. (Names can be strings, (attribute name, namespace name) tuples or attribute classes or instances). Note that "fancy" attributes (i.e. those containing non-text) will not be considered: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.attrstartswith("class", "icon-")): ... print(node.string()) ... ... def ``__init__``​(``self``, ``attrname``, *``attrvalues``): ----------------------------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ====================================== class ``attrendswith``​(``Selector``): ====================================== Selector that selects all element nodes where an attribute with the specified name ends with one of the specified strings. (Names can be strings, (attribute name, namespace name) tuples or attribute classes or instances). Note that "fancy" attributes (i.e. those containing non-text) will not be considered: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.attrendswith("href", ".css")): ... print(node.attrs.href) ... https://www.python.org/static/stylesheets/style.css https://www.python.org/static/stylesheets/mq.css def ``__init__``​(``self``, ``attrname``, *``attrvalues``): ----------------------------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- =============================== class ``hasid``​(``Selector``): =============================== Selector that selects all element nodes where the ``id`` attribute has one if the specified values: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.hasid("id-search-field")): ... print(node.string()) ... def ``__init__``​(``self``, *``ids``): -------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ================================== class ``hasclass``​(``Selector``): ================================== Selector that selects all element nodes where the ``class`` attribute contains one of the specified values: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.hasclass("tier-1")/html.a): ... print(node.string()) ... A A Socialize Sign In About Downloads ... def ``__init__``​(``self``, *``classnames``): --------------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ======================================== class ``InAttrSelector``​(``Selector``): ======================================== Selector that selects all attribute nodes and nodes inside of attributes: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.inattr & xsc.Text, enterattrs=True, enterattr=True): ... print(path[-3].xmlname, path[-2].xmlname, path[-1].string()) ... html class no-js html dir ltr html lang en meta charset utf-8 meta content IE=edge meta http-equiv X-UA-Compatible ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ==================================== class ``Combinator``​(``Selector``): ==================================== A ``Combinator`` is a selector that transforms one or combines two or more other selectors in a certain way. ============================================ class ``BinaryCombinator``​(``Combinator``): ============================================ A ``BinaryCombinator`` is a combinator that combines two selector: the left hand selector and the right hand selector. def ``__init__``​(``self``, ``left``, ``right``): ------------------------------------------------- def ``__str__``​(``self``): --------------------------- ================================================= class ``ChildCombinator``​(``BinaryCombinator``): ================================================= A ``ChildCombinator`` is a ``BinaryCombinator``. To match the ``ChildCombinator`` the node must match the right hand selector and its immediate parent must match the left hand selector (i.e. it works similar to the ``>`` combinator in CSS or the ``/`` combinator in XPath). ``ChildCombinator`` objects can be created via the division operator (``/``): >>> from ll.xist import xsc, parse >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(html.a/html.img): ... print(node.string()) ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ ====================================================== class ``DescendantCombinator``​(``BinaryCombinator``): ====================================================== A ``DescendantCombinator`` is a ``BinaryCombinator``. To match the ``DescendantCombinator`` the node must match the right hand selector and any of its ancestor nodes must match the left hand selector (i.e. it works similar to the descendant combinator in CSS or the ``//`` combinator in XPath). ``DescendantCombinator`` objects can be created via the floor division operator (``//``): >>> from ll.xist import xsc, parse >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(html.div//html.img): ... print(node.string()) ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ =========================================================== class ``AdjacentSiblingCombinator``​(``BinaryCombinator``): =========================================================== A ``AdjacentSiblingCombinator`` is a ``BinaryCombinator``. To match the ``AdjacentSiblingCombinator`` the node must match the right hand selector and the immediately preceding sibling must match the left hand selector. ``AdjacentSiblingCombinator`` objects can be created via the multiplication operator (``*``). The following example outputs all ``span`` elements that immediately follow a ``form`` element: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(html.form*html.span): ... print(node.string()) ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ ========================================================== class ``GeneralSiblingCombinator``​(``BinaryCombinator``): ========================================================== A ``GeneralSiblingCombinator`` is a ``BinaryCombinator``. To match the ``GeneralSiblingCombinator`` the node must match the right hand selector and any of the preceding siblings must match the left hand selector. ``AdjacentSiblingCombinator`` objects can be created via the exponentiation operator (``**``). The following example outputs all ``meta`` element that come after the ``link`` elements: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(html.link**html.meta): ... print(node.string()) ... ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ ============================================= class ``ChainedCombinator``​(``Combinator``): ============================================= A ``ChainedCombinator`` combines any number of other selectors. def ``__init__``​(``self``, *``selectors``): -------------------------------------------- def ``__str__``​(``self``): --------------------------- =============================================== class ``OrCombinator``​(``ChainedCombinator``): =============================================== An ``OrCombinator`` is a ``ChainedCombinator`` where the node must match at least one of the selectors to match the ``OrCombinator``. An ``OrCombinator`` can be created with the binary or operator (``|``): >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.hasattr("href") | xfind.hasattr("src")): ... print(node.attrs.href if "href" in node.Attrs else node.attrs.src) ... https://ajax.googleapis.com/ https://www.python.org/static/js/libs/modernizr.js https://www.python.org/static/stylesheets/style.css https://www.python.org/static/stylesheets/mq.css https://www.python.org/static/favicon.ico ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__or__``​(``self``, ``other``): ------------------------------------- ================================================ class ``AndCombinator``​(``ChainedCombinator``): ================================================ An ``AndCombinator`` is a ``ChainedCombinator`` where the node must match all of the combined selectors to match the ``AndCombinator``. An ``AndCombinator`` can be created with the binary and operator (``&``): >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(html.input & xfind.hasattr("id")): ... print(node.string()) ... def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__and__``​(``self``, ``other``): -------------------------------------- ========================================= class ``NotCombinator``​(``Combinator``): ========================================= A ``NotCombinator`` inverts the selection logic of the underlying selector, i.e. a node matches only if it does not match the underlying selector. A ``NotCombinator`` can be created with the unary inversion operator (``~``). The following example outputs all internal scripts: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(html.script & ~xfind.hasattr("src")): ... print(node.string()) ... def ``__init__``​(``self``, ``selector``): ------------------------------------------ def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ========================================== class ``CallableSelector``​(``Selector``): ========================================== A ``CallableSelector`` is a selector that calls a user specified callable to select nodes. The callable gets passed the path and must return a bool specifying whether this path is selected. A ``CallableSelector`` is created implicitely whenever a callable is passed to a method that expects a selector. The following example outputs all links that point outside the ``python.org`` domain: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> def isextlink(path): ... return isinstance(path[-1], html.a) and not str(path[-1].attrs.href).startswith("https://www.python.org") ... >>> for node in doc.walknodes(isextlink): ... print(node.string()) ... Docs PyPI Smaller Larger .. def ``__init__``​(``self``, ``func``): -------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- ================================== class ``nthchild``​(``Selector``): ================================== An ``nthchild`` object is a selector that selects every node that is the n-th child of its parent. E.g. ``nthchild(0)`` selects every first child, ``nthchild(-1)`` selects each last child. Furthermore ``nthchild("even")`` selects each first, third, fifth, ... child and ``nthchild("odd")`` selects each second, fourth, sixth, ... child. def ``__init__``​(``self``, ``index``): --------------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): --------------------------- =================================== class ``nthoftype``​(``Selector``): =================================== An ``nthoftype`` object is a selector that selects every node that is the n-th node of a specified type among its siblings. Similar to ``nthchild`` ``nthoftype`` supports negative and positive indices as well as ``"even"`` and ``"odd"``. Which types are checked can be passed explicitly. If no types are passed the type of the node itself is used: >>> from ll.xist import xsc, parse, xfind >>> from ll.xist.ns import xml, html, chars >>> doc = parse.tree( ... parse.URL("https://www.python.org/"), ... parse.Tidy(), ... parse.NS(html), ... parse.Node(pool=xsc.Pool(xml, html, chars)) ... ) >>> for node in doc.walknodes(xfind.nthoftype(0, html.h2)): ... print(node.string()) ...

Get Started

Download

Docs

Jobs

... def ``__init__``​(``self``, ``index``, *``types``): --------------------------------------------------- def ``_find``​(``self``, ``path``): ----------------------------------- def ``__contains__``​(``self``, ``path``): ------------------------------------------ def ``__str__``​(``self``): ---------------------------