9,jJUddlmZdZddgZddlmZmZmZmZm Z m Z m Z m Z m Z mZddlmZddlmZddlmZdd lmZdd lmZmZmZmZmZmZmZdd lmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%dd l&m'Z'dd l(m)Z)e rddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1ddl2m3Z3dZ4de5d<ddZ6eej7ej8fZ9de5d<ee9e ej7e ej8fZ:de5d<Gdde$Z;Gdde"e;Zz_invert..Fs*3341aA333333)dictlistitems)r0s r:_invertr@Ds- 334 ??333 3 33r<r _LXMLParser_ParserOrParserClassceZdZUejZded<dZded<ded<ded<d Zd ed <d gZ d ed<ee e e e gZd ed<dZded<edZded<eeZded<ded<ded<ded<ded <dVfd% ZdWd(ZdXd,ZdYd.Z dZd[fd2 Zd\d5Z d]d^d=Zd_d>Zd`d?ZifdadDZdbdHZdcdIZdddLZ dedMZ!dfdQZ"dgdSZ#dhdUZ$xZ%S)irzType[etree.XMLParser]DEFAULT_PARSER_CLASSTboolis_xml huge_treezType[ProcessingInstruction]processing_instruction_classzlxml-xmlr.NAMExml Iterable[str]ALTERNATE_NAMESfeaturesiint CHUNK_SIZEz$http://www.w3.org/XML/1998/namespace)rJr)DEFAULT_NSMAPSr*DEFAULT_NSMAPS_INVERTEDz)List[Optional[_InvertedNamespaceMapping]]nsmapsOptional[Set[str]]empty_element_tagsrparserOptional[etree.XMLParser]_default_parsersoupr,r2Nonectt||||jdS)zLet the BeautifulSoup object know about the standard namespace mapping. :param soup: A `BeautifulSoup`. N)superrinitialize_soup_register_namespacesrP)selfrX __class__s r:r\z%LXMLTreeBuilderForXML.initialize_soupvsA #T**::4@@@ !!$"566666r<mappingDict[str, str]c|jJt|D]$\}}|r||jjvr||jj|<%dS)aLet the BeautifulSoup object know about namespaces encountered while parsing the document. This might be useful later on when creating CSS selectors. This will track (almost) all namespaces, even ones that were only in scope for part of the document. If two namespaces have the same prefix, only the first one encountered will be tracked. Un-prefixed namespaces are not tracked. :param mapping: A dictionary mapping namespace prefixes to URIs. N)rXr>r? _namespaces)r^r`keyvalues r:r]z*LXMLTreeBuilderForXML._register_namespacessjy$$$w}}// 3 3JC  3s$)"777.3 %c* 3 3r<encodingOptional[_Encoding]rBcZ|j|jS||d|j|S)zFind the default parser for the given encoding. :return: Either a parser object or a class, which will be instantiated with default arguments. NTtargetrecoverrGrf)rWrDrGr^rfs r:default_parserz$LXMLTreeBuilderForXML.default_parsers6   +' '((ddngo(pppr<rAcv||}t|r||d|j|}|S)zInstantiate an appropriate parser for the given encoding. :param encoding: A string. :return: A parser object such as an `etree.XMLParser`. Tri)rmcallablerG)r^rfrUs r: parser_forz LXMLTreeBuilderForXML.parser_forsH$$X.. F   dV4ZbcccF r<NFkwargsc ||_d|_|jg|_t |jg|_|jr t|_ n t|_ d|vr t|d<||_ tt|jdi|dS)Nattribute_dict_classr6)rWrXrQrRr=rPactive_namespace_prefixesrFrrHrrrGr[r__init__)r^rUrTrGrqr_s r:ruzLXMLTreeBuilderForXML.__init__s & 34 *.t/B*C*C)D& ; F0HD - -0ED - ! / /-=F) *"3#T**3==f=====r<tagTuple[Optional[str], str]ct|ddkr)d|vr%|dddd\}}||fSd|fS)Nr{})split)r^rv namespacenames r: _getNsTagzLXMLTreeBuilderForXML._getNsTagsM q6S==SCZZ!!""gmmC33OItt$ $c{r<markupr+user_specified_encodingdocument_declared_encodingexclude_encodingsOptional[_Encodings]RIterable[Tuple[Union[str, bytes], Optional[_Encoding], Optional[_Encoding], bool]]c#K|jstj|dt|tr1t |dkr|ddkr |dd}|d|dfVt|tr|dd|dfVdSg}|r||g}|r||t||||j | }|j D]}|j ||dfVdS) aBRun any preliminary steps necessary to make incoming markup acceptable to the parser. lxml really wants to get a bytestring and convert it to Unicode itself. So instead of using UnicodeDammit to convert the bytestring to Unicode using different encodings, this implementation uses EncodingDetector to iterate over the encodings, and tell lxml to try to parse the document as each one in turn. :param markup: Some markup -- hopefully a bytestring. :param user_specified_encoding: The user asked to try this encoding. :param document_declared_encoding: The markup itself claims to be in this encoding. :param exclude_encodings: The user asked _not_ to try any of these encodings. :yield: A series of 4-tuples: (markup, encoding, declared encoding, has undergone character replacement) Each 4-tuple represents a strategy for converting the document to Unicode and parsing it. Each strategy will be tried in turn. ) stacklevelrur{NFutf8)known_definite_encodingsuser_encodingsis_htmlr) rFrwarn_if_markup_looks_like_xml isinstancer.lenencodeappendr# encodingsr) r^rrrrrrdetectorrfs r:prepare_markupz$LXMLTreeBuilderForXML.prepare_markupsnB{ W # @TU V V V V fc " " B6{{Q6!90E#E#E$ :EA A A A fc " " ==((&2LeT T T T F46 " E % + +,C D D D*, % >  ! !"< = = =# %=) O/    !* Q QH?H.H%P P P P P Q Qr<ct|trt|}n$t|trt |}|jJ||j} ||jj |_ |j |t|dkrZ||j}t|dkr|j |t|dkZ|j dS#ttt jf$r}t%|d}~wwxYw)Nr)rbytesrr.rrXreadrOrporiginal_encodingrUfeedrcloseUnicodeDecodeError LookupErrorr ParserErrorr$)r^riodataes r:rzLXMLTreeBuilderForXML.feed&sC fe $ $ "BB  $ $ "&!!By$$$wwt'' *//$)*EFFDK K  T " " "d))q..wwt//t99>>K$$T*** d))q.. K       "K1BC * * *&q)) ) *s.CD44E$EE$c |jg|_dSr5)rQrR)r^s r:rzLXMLTreeBuilderForXML.close@s34 r< str | bytesattribDict[str | bytes, str | bytes]nsmapc|jJt|tsJ|}|D]8\}}t|tsJt|tsJ|||<9d}d}t |dkr3t |jdkr|jdnt |dkr|||jt|t|j d} | |d| vr| d=|j | t|D]\} }td| d} ||| <|} t|D]P\} }|| \}} ||| | <%||}t|| |} || | <Q||\}}||}|j|||| |j ddS)Nrr{xmlnszhttp://www.w3.org/2000/xmlns/) namespaces)rXrr.rsr?rrRrr]r@r=rtupdater>rr_prefix_for_namespacehandle_starttag)r^rvrr new_attribr8r9nsprefixr}current_mappingprefix attribute final_attribattrres r:startzLXMLTreeBuilderForXML.startCsy$$$#s#####  % % ' ' LLNN  DAqa%% % %%a%% % %%JqMM/3-1 u::??s4;//!33 K  t $ $ $ $ ZZ!^^  % %e , , , K  wu~~ . . . #4#A"#EFFO  " "5 ) ) ) _$$#B'  * 1 1/ B B B&*%++--%8%8 2 2! /V%D )2 9%% '+&?&?&A&A  0 0 2 233 + +KD%"nnT22OIt %* T""55i@@*8T9EE%* T"",, 3--i88 !!    5b9 "     r<r}Optional[_NamespaceURL]Optional[_NamespacePrefix]c\|dSt|jD]}|||vr ||cSdS)z9Find the currently active prefix for the given namespace.N)reversedrR)r^r}inverted_nsmaps r:rz+LXMLTreeBuilderForXML._prefix_for_namespacesO  4&t{33 1 1N)i>.I.I%i0000tr<c|jJt|tsJ|j||\}}d}|'t |jD]}|||vr ||}n|j||t|jdkr6|j }||j dSdSdS)Nr{) rXrr.endDatarrrR handle_endtagrpoprt)r^rvr}rrout_of_scope_nsmaps r:endzLXMLTreeBuilderForXML.endsy$$$#s##### ,, 3  "*4;"7"7  !-)~2M2M-i8HE X... t{  a  "&!2!2 !-.2244444  .-r<rjrc|jJ|j|dz|z}|j||j|jdS)N )rXr handle_datarH)r^rjrs r:pizLXMLTreeBuilderForXML.pisgy$$$ |d" d### $;<<<< %sr6r^rs r:test_fragment_to_documentz/LXMLTreeBuilderForXML.test_fragment_to_documents ;hFFr<)rXr,r2rY)r`rar2rYrfrgr2rB)rfrgr2rA)NNF)rUrVrTrSrGrErqr)rvr.r2rw)NNN) rr+rrgrrgrrr2rrr+r2rY)r2rY)rvrrrrr)r2rY)r}rr2r)rvrr2rY)rjr.rr.r2rY)rrr2rY)r~r.rr.rr.r2rY)rrr2rYrr.r2r.)&__name__ __module__ __qualname__r XMLParserrD__annotations__rFrIrLr/r"rr rMrOr=rPr@rQr\r]rmrprurrrrrrrrrrrr __classcell__)r_s@r:rrOs27/AAAAF OOO====D&+WO,,,, $T3jAHAAAAJ)-1W(X(X(XNXXXX9@9P9PPPPP5555****KKK.... 7 7 7 7 7 733332qqqq     1559# >>>>>>>28<:>26 QQQQQQQQQQf****45555$& W W W W W r    5555.====$$$$ 2222####GGGGGGGGr<ceZdZUeZded<dgZded<eeeee e gzZ ded<dZ ded <ddZ ddZddZdS)rr.rIz lxml-htmlrKrLrMFrErFrfrgr2rBctjSr5)r HTMLParserrls r:rmzLXMLTreeBuilder.default_parsers r<rr+rYc2|jJ|jj} |||_|j||jdS#t ttj f$r}t|d}~wwxYwr5) rXrrprUrrrrrrr$)r^rrfrs r:rzLXMLTreeBuilder.feedsy$$$9. *//(33DK K  V $ $ $ K       "K1BC * * *&q)) ) *sA A&&BBBrc d|zS)rz%sr6rs r:rz)LXMLTreeBuilder.test_fragment_to_documents -88r<Nrrr)rrrr/rIrrLr>rrr rMrFrmrrr6r<r:rrsD&1]O2222"d?33tT46TTHTTTTF     * * * *999999r<N)r0r1r2r1)= __future__r __license____all__typingrrr r r r r rrrrrrtyping_extensionsrr-r bs4.elementrrrrrrr bs4.builderrrrrr r!r" bs4.dammitr#bs4.exceptionsr$ bs4._typingr%r&r'r(r)r*r+bs4r,r/rr@rrrArBrrr6r<r:rs3"""""""                          ''''''('''''////// ""!!!!! 4444 u0@@A AAAA"'eo&U-=(>># LGLGLGLGLGKLGLGLG^ 99999o'<99999r<