
    (ph              	          % S r SrSSKrSSKJr  SSKJr  SSKrSSKJrJ	r	  SSK
Jr  SSKJrJrJrJrJrJr  \(       a  SS	KJr  SSKrSSKrSSKrSSKrSSKrSSKrS!S jrS"S
SS\S\SS4S jjr " S S\5      rS
\SS4S jr Sr!\\"S'   Sr#\\"S'   S#S\$S\4S jjr%S$S\$S\4S jjr&S%S\$S\4S jjr'S&S\$SS4S jjr(S'S\$S\SS4S jjr)\*S :X  a!  \" \RV                  RY                  5       5        gg)(z=Diagnostic functions, mainly for use when doing tech support.MIT    N)BytesIO)
HTMLParser)BeautifulSoup__version__)builder_registry)AnyIOListOptionalTupleTYPE_CHECKING)_IncomingMarkupdatar   returnc           	         [        S[        -  5        [        S[        R                  -  5        / SQnU HK  n[        R
                   H  nX#R                  ;   d  M    M*     UR                  U5        [        SU-  5        MM     SU;   aM  UR                  S5         SSK	J
n  [        S	S
R                  [        [        UR                  5      5      -  5        SU;   a   SSKn[        SUR                  -  5        [#        U S5      (       a  U R%                  5       n U HX  n[        SU-  5        Sn ['        XS9nSnU(       a'  [        SU-  5        [        WR/                  5       5        [        S5        MZ     g! [         a    [        S5         Nf = f! [         a    [        S5         Nf = f! [(         a&    [        SU-  5        [*        R,                  " 5          Nf = f)zDiagnostic suite for isolating common problems.

:param data: Some markup that needs to be explained.
:return: None; diagnostics are printed to standard output.
z'Diagnostic running on Beautiful Soup %szPython version %s)html.parserhtml5liblxmlz;I noticed that %s is not installed. Installing it may help.r   zlxml-xmlr   etreezFound lxml version %s.z.lxml is not installed or couldn't be imported.r   NzFound html5lib version %sz2html5lib is not installed or couldn't be imported.readz#Trying to parse your markup with %sF)featuresT%s could not parse the markup.z#Here's what %s did with the markup:zP--------------------------------------------------------------------------------)printr   sysversionr   buildersr   removeappendr   r   joinmapstrLXML_VERSIONImportErrorr   hasattrr   r   	Exception	traceback	print_excprettify)	r   basic_parsersnamebuilderr   r   parsersuccesssoups	            ?/var/www/html/venv/lib/python3.13/site-packages/bs4/diagnose.pydiagnoser3       s    
4{BD	,.7M'00G''' 1   &NQUU  Z(	D"*SXXc#u?Q?Q6R-SSU ]"	H.1E1EEG tVyy{4v=?	" 7DG 86AC4==?$x    	DBC	D  	HFG	H  	"3f<>!	"s6   ;E: F 1F0:FFF-,F-0-G G htmlkwargsc                 R   SSK Jn  UR                  SS5      n[        U [        5      (       a  U R                  S5      n [        U [        5      (       d  [        U 5      nUR                  " W4XS.UD6 H0  u  pg[        U< SUR                  <S SUR                  < 35        M2     g	)
a  Print out the lxml events that occur during parsing.

This lets you see how lxml parses a document when no Beautiful
Soup code is running. You can use this to determine whether
an lxml-specific problem is in Beautiful Soup's lxml tree builders
or in lxml itself.

:param data: Some markup.
:param html: If True, markup will be parsed with lxml's HTML parser.
   if False, lxml's XML parser will be used.
r   r   recoverTutf8)r4   r7   z, z>4N)r   r   pop
isinstancer$   encoder
   r   	iterparser   tagtext)r   r4   r5   r   r7   readereventelements           r2   
lxml_tracerB   X   s     jjD)G${{6"dB//&WtWPVWw{{GLLAC X    c            	           \ rS rSrSrS\SS4S jr SS\S\\\\	\   4      S	\
SS4S
 jjrSS\S\
SS4S jjrS\SS4S jrS\SS4S jrS\SS4S jrS\SS4S jrS\SS4S jrS\SS4S jrS\SS4S jrSrg)AnnouncingParsero   zSubclass of HTMLParser that announces parse events, without doing
anything else.

You can use this to get a picture of how html.parser sees a given
document. The easiest way to do this is to call `htmlparser_trace`.
sr   Nc                     [        U5        g )N)r   )selfrG   s     r2   _pAnnouncingParser._pw   s	    arC   r-   attrshandle_empty_elementc                 2    U R                  U SU S35        g )N z STARTrJ   )rI   r-   rL   rM   s       r2   handle_starttag AnnouncingParser.handle_starttagz   s     	4&%'(rC   check_already_closedc                 ,    U R                  SU-  5        g )Nz%s ENDrP   )rI   r-   rS   s      r2   handle_endtagAnnouncingParser.handle_endtag   s    4 rC   r   c                 ,    U R                  SU-  5        g )Nz%s DATArP   rI   r   s     r2   handle_dataAnnouncingParser.handle_data       	D !rC   c                 ,    U R                  SU-  5        g )Nz
%s CHARREFrP   rI   r-   s     r2   handle_charrefAnnouncingParser.handle_charref       t#$rC   c                 ,    U R                  SU-  5        g )Nz%s ENTITYREFrP   r]   s     r2   handle_entityref!AnnouncingParser.handle_entityref   s    %&rC   c                 ,    U R                  SU-  5        g )Nz
%s COMMENTrP   rX   s     r2   handle_commentAnnouncingParser.handle_comment   r`   rC   c                 ,    U R                  SU-  5        g )Nz%s DECLrP   rX   s     r2   handle_declAnnouncingParser.handle_decl   r[   rC   c                 ,    U R                  SU-  5        g )Nz%s UNKNOWN-DECLrP   rX   s     r2   unknown_declAnnouncingParser.unknown_decl   s    !D()rC   c                 ,    U R                  SU-  5        g )Nz%s PIrP   rX   s     r2   	handle_piAnnouncingParser.handle_pi   s    $rC    T)__name__
__module____qualname____firstlineno____doc__r$   rJ   r   r   r   boolrQ   rU   rY   r^   rb   re   rh   rk   rn   __static_attributes__rp   rC   r2   rE   rE   o   s    C D  &*	)) E#x},-.) #	)
 
)!# !T !T !" " "%3 %4 %'S 'T '%3 %4 %" " "* * * c  d  rC   rE   c                 :    [        5       nUR                  U 5        g)zPrint out the HTMLParser events that occur during parsing.

This lets you see how HTMLParser parses a document when no
Beautiful Soup code is running.

:param data: Some markup.
N)rE   feed)r   r/   s     r2   htmlparser_tracer{      s     F
KKrC   aeiou_vowelsbcdfghjklmnpqrstvwxyz_consonantslengthc                     Sn[        U 5       H2  nUS-  S:X  a  [        nO[        nU[        R                  " U5      -  nM4     U$ )z4Generate a random word-like string.

:meta private:
    r   )ranger   r}   randomchoice)r   rG   its       r2   rwordr      sF    
 	A6]q5A:AA	V]]1  HrC   c                 D    SR                  S [        U 5       5       5      $ )z8Generate a random sentence-like string.

:meta private:
rO   c              3   b   #    U  H%  n[        [        R                  " S S5      5      v   M'     g7f)   	   N)r   r   randint).0r   s     r2   	<genexpr>rsentence.<locals>.<genexpr>   s#     GAE&..A.//s   -/)r"   r   )r   s    r2   	rsentencer      s    
 88GvGGGrC   num_elementsc           	         / SQn/ n[        U 5       H  n[        R                  " SS5      nUS:X  a,  [        R                  " U5      nUR	                  SU-  5        ML  US:X  a1  UR	                  [        [        R                  " SS5      5      5        M  US:X  d  M  [        R                  " U5      nUR	                  SU-  5        M     S	S
R                  U5      -   S-   $ )z<Randomly generate an invalid HTML document.

:meta private:
)pdivspanr   bscripttabler      z<%s>   r   r   z</%s>z<html>
z</html>)r   r   r   r   r!   r   r"   )r   	tag_nameselementsr   r   tag_names         r2   rdocr      s    
 BIH< 1%Q;}}Y/HOOFX-.q[OOIfnnQ&:;<q[}}Y/HOOGh./ ! dii))I55rC   c                    [        S[        -  5        [        U 5      n[        S[        U5      -  5        SSS/SS4 HY  nSn [        R                  " 5       n[        X5        [        R                  " 5       nSnU(       d  MF  [        S
UWW-
  4-  5        M[     SSK	J
n  [        R                  " 5       nUR                  U5        [        R                  " 5       n[        SXT-
  -  5        SSKnUR                  5       n[        R                  " 5       nUR                  U5        [        R                  " 5       n[        SXT-
  -  5        g! [         a'    [        S	U-  5        [        R                  " 5          GNf = f)z.Very basic head-to-head performance benchmark.z1Comparative parser benchmark on Beautiful Soup %sz3Generated a large invalid HTML document (%d bytes).r   r4   r   r   FTr   z"BS4+%s parsed the markup in %.2fs.r   r   z$Raw lxml parsed the markup in %.2fs.Nz(Raw html5lib parsed the markup in %.2fs.)r   r   r   lentimer   r(   r)   r*   r   r   HTMLr   r   parse)	r   r   parser_namer0   ar   r   r   r/   s	            r2   benchmark_parsersr      s5   	>LND	@3t9LN 0*mL	"		A$,		AG 77;A:NNP M 		A	JJt		A	1QU;=  "F		A
LL		A	5?A'  	"3kAC!	"s   7E-E<;E<r/   c                    [         R                  " 5       nUR                  n[        U 5      n[	        [
        XAS9n[        R                  " SXUU5        [        R                  " U5      nUR                  S5        UR                  SS5        g)z7Use Python's profiler on a randomly generated document.)bs4r   r/   zbs4.BeautifulSoup(data, parser)
cumulativez_html5lib|bs42   N)tempfileNamedTemporaryFiler-   r   dictr   cProfilerunctxpstatsStats
sort_statsprint_stats)r   r/   
filehandlefilenamer   varsstatss          r2   profiler      sl    ,,.JHDCd2DOO5t8LLL"E	\"	or*rC   __main__)r   r   r   Nrq   )   )r   )i  )順 )r   r   )-rv   __license__r   ior   html.parserr   r   r   r   bs4.builderr   typingr	   r
   r   r   r   r   bs4._typingr   r   r   r   r   r)   r   r3   rw   rB   rE   r$   r{   r}   __annotations__r   intr   r   r   r   r   rr   stdinr   rp   rC   r2   <module>r      s7   C    " 
 * (  +      
5pD& Dd DS DT D.) z ) X	3 	4 	  *S *# c Hc H# H6s 6c 6, BC  BT  BF+# + + +  zSYY^^ rC   