B C;]&@sdZddlmZddddddd d d d d ddddd dgZddlZddlZddlZddlmZyddl m Z m Z Wn$e k rddl m Z m Z YnXddlmZddlmZddlmZyddlmZWn e k rddlmZYnXyeWnek r eZYnXyeWnek r4eefZYnXddZdZejdd eid!Zejd"d eid!Zejd#d eid!Z ed$Z!ed%Z"ed&Z#e$d'ej%j&Z'e$d(j&Z(ejd)d eid!Z)e$d*Z*e$d+ej%j+Z,d,d-Z-d.d/Z.d0d1Z/Gd2d3d3e Z0Gd4d5d5e1Z2Gd6d7d7e1Z3e3d d8d9Z4e3d d8d9Z5e3dd:d9Z6e3dd:d9Z7e3dd8d9Z8e3dd:d9Z9Gd;d<dd>eje2Z?GdAdBdBej@e2ZAGdCdDdDejBZCe$edEej%jDZEe$dEFdFej%jDZGd~dGdZHddHdZIddIdZJddJdZKddKdZLdLdMZMdNdOZNGdPdQdQe=ZOeOeCjPdR<ddSd ZQdTdUZRGdVdWdWe ZSGdXdYdYe1ZTGdZd[d[e1ZUGd\d]d]eUe=ZVeVeCjPd^<Gd_d`d`eUe=ZWeWeCjPda<GdbdcdceZXGdddedeeYZZGdfdgdgeYZ[GdhdidieZ\GdjdkdkeUe=Z]e]eCjPdl<Gdmdndne=Z^e^eCjPdo<dpdqZ_drdsZ`e$dtjaZbe$dtFdujaZcddwdZdeedjed_ddxd ZeGdydzdzejfZfGd{d|d|ejgZhd}dZiefZjehZkdS)z.The ``lxml.html`` tool set for HTML handling. )absolute_importdocument_fromstringfragment_fromstringfragments_fromstring fromstringtostringElementdefsopen_in_browser submit_formfind_rel_links find_classmake_links_absoluteresolve_base_href iterlinks rewrite_linksparseN)partial)MutableMapping MutableSet)etree)r )SetMixin)urljoincCsB|s|Stjddkr(tdtjj}ntdtjj}|d|S)Nrz^(\s*)u'z^(\s*)b'z\1')sys version_inforecompileMsub)sr!r#E/opt/alt/python37/lib64/python3.7/site-packages/lxml/html/__init__.py__fix_docstringKs r%zhttp://www.w3.org/1999/xhtmlz9descendant-or-self::a[@rel]|descendant-or-self::x:a[@rel]x) namespacesz7descendant-or-self::option|descendant-or-self::x:optionz3descendant-or-self::form|descendant-or-self::x:formztdescendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), concat(' ', $class_name, ' '))]zdescendant-or-self::*[@id=$id]zstring()z&url\((["][^"]*["]|['][^']*[']|[^)]*)\)z@import "(.*?)"z%//label[@for=$id]|//x:label[@for=$id]z[^ ]+z%[^;=]*;\s*(?:url\s*=\s*)?(?P.*)$cCs`|dddkr |dddks@|dddkrT|dddkrT|dd|dfS||fSdS)Nr"'r#)r"posr#r#r$_unquote_matchjs@r,cCs4t|trt|ddSt|tr,t|ddS|SdS)z1Convert the result back into the input type. zutf-8)encodingunicodeN) issubclassbytesrr.)typresultr#r#r$_transform_resultqs     r3cCs@t|tr<|ddkr<|dttdtkr<|ddS|S)Nr{r}r)) isinstance basestringlenXHTML_NAMESPACEsplit)tagr#r#r$_nons|s $r<cs`eZdZdZddZddZddZfdd Zd d Zd d Z ddZ ddZ ddZ Z S)Classesa*Provides access to an element's class attribute as a set-like collection. Usage:: >>> el = fromstring('') >>> classes = el.classes # or: classes = Classes(el.attrib) >>> classes |= ['block', 'paragraph'] >>> el.get('class') 'hidden large block paragraph' >>> classes.toggle('hidden') False >>> el.get('class') 'large block paragraph' >>> classes -= ('some', 'classes', 'block') >>> el.get('class') 'large paragraph' cCs||_t|jdd|_dS)Nclass) _attributesrget_get_class_value)selfZ attributesr#r#r$__init__szClasses.__init__cCsR|rtd|rtd||}||kr4dS||d||jd<dS)z[ Add a class. This has no effect if the class is already present. z\szInvalid class name: %rN r>)rsearch ValueErrorrBr:appendjoinr@)rCvalueclassesr#r#r$adds   z Classes.addcsbrtdrtdfdd|D}|rLd||jd<nd|jkr^|jd=dS)zn Remove a class if it is currently present. If the class is not present, do nothing. z\szInvalid class name: %rcsg|]}|kr|qSr#r#).0name)rJr#r$ sz#Classes.discard..rEr>N)rrFrGrBr:rIr@)rCrJrKr#)rJr$discards  zClasses.discardcs0|rtd|rtd|tt||dS)zw Remove a class; it must currently be present. If the class is not present, raise a KeyError. z\szInvalid class name: %rN)rrFrGsuperr=remove)rCrJ) __class__r#r$rRs zClasses.removecCs|}||ko||kS)N)rBr:)rCrNrKr#r#r$ __contains__szClasses.__contains__cCst|S)N)iterrBr:)rCr#r#r$__iter__szClasses.__iter__cCst|S)N)r8rBr:)rCr#r#r$__len__szClasses.__len__cCsL|}d}x"|D]}||kr||d}qW|rHd||jd<dS)z. Add all names from 'values'. FTrEr>N)rBr:rHrIr@)rCvaluesrKZextendedrJr#r#r$updates   zClasses.updatecCs|rtd|rtd||}y||d}Wn"tk r\||d}YnX|rtd||jd<n|jd=|S)z Add a class name if it isn't there yet, or remove it if it exists. Returns true if the class was added (and is now enabled) and false if it was removed (and is now disabled). z\szInvalid class name: %rFTrEr>) rrFrGrBr:rRrHrIr@)rCrJrKZenabledr#r#r$toggles     zClasses.toggle)__name__ __module__ __qualname____doc__rDrLrPrRrTrVrWrYrZ __classcell__r#r#)rSr$r=s  r=cseZdZd+fdd ZeddZejddZeddZed d Zed d Z ed dZ eddZ e jddZ e j ddZ ddZ ddZddZddZddZddZd,d d!Zd-d#d$Zd.d%d&Zd'd(Zd/d)d*ZZS)0 HtmlMixinNcstt|||dS)zset(self, key, value=None) Sets an element attribute. If no value is provided, or if the value is None, creates a 'boolean' attribute without value, e.g. "
" for ``form.set('novalidate')``. N)rQ HtmlElementset)rCkeyrJ)rSr#r$rbsz HtmlMixin.setcCs t|jS)zB A set-like wrapper around the 'class' attribute. )r=attrib)rCr#r#r$rKszHtmlMixin.classescCsBt|tst|}|r(|d|n|ddk r>|jd=dS)Nr>)r6r=AssertionErrorrBrbrArd)rCrKrJr#r#r$rKs cCs |jjS)z Returns the base URL, given when the page was parsed. Use with ``urlparse.urljoin(el.base_url, href)`` to get absolute URLs. )Z getroottreedocinfoZURL)rCr#r#r$base_url szHtmlMixin.base_urlcCst|S)z0 Return a list of all the forms ) _forms_xpath)rCr#r#r$formsszHtmlMixin.formscCs|jddtiddS)zt Return the element. Can be called from a child element to get the document's head. z//body|//x:bodyr&)r'r)xpathr9)rCr#r#r$bodyszHtmlMixin.bodycCs|jddtiddS)zu Returns the element. Can be called from a child element to get the document's head. z//head|//x:headr&)r'r)rjr9)rCr#r#r$head#szHtmlMixin.headcCs2|d}|sdSt||d}|s&dS|dSdS)zN Get or set any