"""CSS Selectors based on XPath. This module supports selecting XML/HTML tags based on CSS selectors. See the `CSSSelector` class for details. This is a thin wrapper around cssselect 0.7 or later. """ from __future__ import absolute_import from . import etree try: import cssselect as external_cssselect except ImportError: raise ImportError( 'cssselect does not seem to be installed. ' 'See http://packages.python.org/cssselect/') SelectorSyntaxError = external_cssselect.SelectorSyntaxError ExpressionError = external_cssselect.ExpressionError SelectorError = external_cssselect.SelectorError __all__ = ['SelectorSyntaxError', 'ExpressionError', 'SelectorError', 'CSSSelector'] class LxmlTranslator(external_cssselect.GenericTranslator): """ A custom CSS selector to XPath translator with lxml-specific extensions. """ def xpath_contains_function(self, xpath, function): # Defined there, removed in later drafts: # http://www.w3.org/TR/2001/CR-css3-selectors-20011113/#content-selectors if function.argument_types() not in (['STRING'], ['IDENT']): raise ExpressionError( "Expected a single string or ident for :contains(), got %r" % function.arguments) value = function.arguments[0].value return xpath.add_condition( 'contains(__lxml_internal_css:lower-case(string(.)), %s)' % self.xpath_literal(value.lower())) class LxmlHTMLTranslator(LxmlTranslator, external_cssselect.HTMLTranslator): """ lxml extensions + HTML support. """ def _make_lower_case(context, s): return s.lower() ns = etree.FunctionNamespace('http://codespeak.net/lxml/css/') ns.prefix = '__lxml_internal_css' ns['lower-case'] = _make_lower_case class CSSSelector(etree.XPath): """A CSS selector. Usage:: >>> from lxml import etree, cssselect >>> select = cssselect.CSSSelector("a tag > child") >>> root = etree.XML("<a><b><c/><tag><child>TEXT</child></tag></b></a>") >>> [ el.tag for el in select(root) ] ['child'] To use CSS namespaces, you need to pass a prefix-to-namespace mapping as ``namespaces`` keyword argument:: >>> rdfns = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' >>> select_ns = cssselect.CSSSelector('root > rdf|Description', ... namespaces={'rdf': rdfns}) >>> rdf = etree.XML(( ... '<root xmlns:rdf="%s">' ... '<rdf:Description>blah</rdf:Description>' ... '</root>') % rdfns) >>> [(el.tag, el.text) for el in select_ns(rdf)] [('{http://www.w3.org/1999/02/22-rdf-syntax-ns#}Description', 'blah')] """ def __init__(self, css, namespaces=None, translator='xml'): if translator == 'xml': translator = LxmlTranslator() elif translator == 'html': translator = LxmlHTMLTranslator() elif translator == 'xhtml': translator = LxmlHTMLTranslator(xhtml=True) path = translator.css_to_xpath(css) etree.XPath.__init__(self, path, namespaces=namespaces) self.css = css def __repr__(self): return '<%s %s for %r>' % ( self.__class__.__name__, hex(abs(id(self)))[2:], self.css)
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
html | Folder | 0755 |
|
|
includes | Folder | 0755 |
|
|
isoschematron | Folder | 0755 |
|
|
ElementInclude.py | File | 8.36 KB | 0644 |
|
__init__.py | File | 575 B | 0644 |
|
_elementpath.cpython-311-x86_64-linux-gnu.so | File | 419.42 KB | 0755 |
|
_elementpath.py | File | 10.49 KB | 0644 |
|
apihelpers.pxi | File | 62.94 KB | 0644 |
|
builder.cpython-311-x86_64-linux-gnu.so | File | 222.23 KB | 0755 |
|
builder.py | File | 7.96 KB | 0644 |
|
classlookup.pxi | File | 21.94 KB | 0644 |
|
cleanup.pxi | File | 8.26 KB | 0644 |
|
cssselect.py | File | 3.29 KB | 0644 |
|
debug.pxi | File | 3.21 KB | 0644 |
|
docloader.pxi | File | 5.65 KB | 0644 |
|
doctestcompare.py | File | 17.91 KB | 0644 |
|
dtd.pxi | File | 14.86 KB | 0644 |
|
etree.cpython-311-x86_64-linux-gnu.so | File | 8.46 MB | 0755 |
|
etree.h | File | 8.37 KB | 0644 |
|
etree.pyx | File | 129.31 KB | 0644 |
|
etree_api.h | File | 17.06 KB | 0644 |
|
extensions.pxi | File | 32.46 KB | 0644 |
|
iterparse.pxi | File | 16.22 KB | 0644 |
|
lxml.etree.h | File | 8.37 KB | 0644 |
|
lxml.etree_api.h | File | 17.06 KB | 0644 |
|
nsclasses.pxi | File | 8.93 KB | 0644 |
|
objectify.cpython-311-x86_64-linux-gnu.so | File | 4.25 MB | 0755 |
|
objectify.pyx | File | 75.29 KB | 0644 |
|
objectpath.pxi | File | 11.21 KB | 0644 |
|
parser.pxi | File | 76.41 KB | 0644 |
|
parsertarget.pxi | File | 6.7 KB | 0644 |
|
proxy.pxi | File | 23.01 KB | 0644 |
|
public-api.pxi | File | 6.5 KB | 0644 |
|
pyclasslookup.py | File | 92 B | 0644 |
|
readonlytree.pxi | File | 18.6 KB | 0644 |
|
relaxng.pxi | File | 5.94 KB | 0644 |
|
sax.cpython-311-x86_64-linux-gnu.so | File | 366.73 KB | 0755 |
|
sax.py | File | 9.18 KB | 0644 |
|
saxparser.pxi | File | 31.78 KB | 0644 |
|
schematron.pxi | File | 5.65 KB | 0644 |
|
serializer.pxi | File | 66.41 KB | 0644 |
|
usedoctest.py | File | 230 B | 0644 |
|
xinclude.pxi | File | 2.4 KB | 0644 |
|
xmlerror.pxi | File | 48.37 KB | 0644 |
|
xmlid.pxi | File | 5.92 KB | 0644 |
|
xmlschema.pxi | File | 7.89 KB | 0644 |
|
xpath.pxi | File | 19.11 KB | 0644 |
|
xslt.pxi | File | 35.83 KB | 0644 |
|
xsltext.pxi | File | 10.83 KB | 0644 |
|