
    Mh              	          U d Z dZddlZddlmZ ddlmZ ddlZddlmZm	Z	 ddl
mZ ddlmZmZmZmZmZmZ erdd	lmZ ddlZddlZddlZddlZddlZddlZd'dZd(d
ddededdfdZ G d de          Zd
eddfdZ dZ!ee"d<   dZ#ee"d<   d)de$defdZ%d*de$defdZ&d+de$defd Z'd,de$ddfd"Z(d-de$d$eddfd%Z)e*d&k    r$ eej+        ,                                           dS dS ).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           	         t          dt          z             t          dt          j        z             g d}|D ]C}t          j        D ]}||j        v r n(|                    |           t          d|z             Dd|v ry|                    d           	 ddl	m
} t          d	d
                    t          t          |j                            z             n# t          $ r t          d           Y nw xY wd|v r<	 ddl}t          d|j        z             n# t          $ r t          d           Y nw xY wt#          | d          r|                                 } |D ]}t          d|z             d}	 t'          | |          }d}n5# t(          $ r( t          d|z             t+          j                     Y nw xY w|r3t          d|z             t          |                                           t          d           dS )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	            L/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/bs4/diagnose.pydiagnoser3       s    
4{BDDD	,...777M  '0 	 	Gw''' (   &&&NQUU   Z(((	D""""""*SXXc#u?Q6R6R-S-SSUUUU 	D 	D 	DBCCCCC	D ]""	HOOO.1EEGGGG 	H 	H 	HFGGGGG	H tV yy{{  4v=???	" 777DGG 	" 	" 	"3f<>>>!!!!!	"  	%86ACCC4==??$$$x s7   AC C87C8 D D87D88F/F>=F>Thtmlkwargsc                 L   ddl m} |                    dd          }t          | t                    r|                     d          } t          | t                    st          |           } |j        |f||d|D ]'\  }}t          |d|j
        dd|j                   (d	S )
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 )%/&WtWWWPVWW D Dww{{{{GLLACCCCD D    c            	           e Zd ZdZdeddfdZ	 ddedeeeee         f                  d	e	ddfd
Z
ddede	ddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdS )AnnouncingParserzSubclass 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                 $    t          |           d S )N)r   )selfrF   s     r2   _pzAnnouncingParser._pw   s    arC   Tr-   attrshandle_empty_elementc                 <    |                      | d| d           d S )N z STARTrI   )rH   r-   rJ   rK   s       r2   handle_starttagz AnnouncingParser.handle_starttagz   s-     	4''%'''(((((rC   check_already_closedc                 6    |                      d|z             d S )Nz%s ENDrN   )rH   r-   rP   s      r2   handle_endtagzAnnouncingParser.handle_endtag   s    4     rC   r   c                 6    |                      d|z             d S )Nz%s DATArN   rH   r   s     r2   handle_datazAnnouncingParser.handle_data       	D !!!!!rC   c                 6    |                      d|z             d S )Nz
%s CHARREFrN   rH   r-   s     r2   handle_charrefzAnnouncingParser.handle_charref       t#$$$$$rC   c                 6    |                      d|z             d S )Nz%s ENTITYREFrN   rX   s     r2   handle_entityrefz!AnnouncingParser.handle_entityref   s    %&&&&&rC   c                 6    |                      d|z             d S )Nz
%s COMMENTrN   rT   s     r2   handle_commentzAnnouncingParser.handle_comment   rZ   rC   c                 6    |                      d|z             d S )Nz%s DECLrN   rT   s     r2   handle_declzAnnouncingParser.handle_decl   rV   rC   c                 6    |                      d|z             d S )Nz%s UNKNOWN-DECLrN   rT   s     r2   unknown_declzAnnouncingParser.unknown_decl   s     !D()))))rC   c                 6    |                      d|z             d S )Nz%s PIrN   rT   s     r2   	handle_pizAnnouncingParser.handle_pi   s    $rC   T)__name__
__module____qualname____doc__r$   rI   r   r   r   boolrO   rR   rU   rY   r\   r^   r`   rb   rd    rC   r2   rE   rE   o   s        C D     &*	) )) E#x},-.) #	)
 
) ) ) )! !# !T !T ! ! ! !" " " " " "%3 %4 % % % %'S 'T ' ' ' '%3 %4 % % % %" " " " " "* * * * * * c  d            rC   rE   c                 L    t                      }|                    |            dS )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_tracern      s'     F
KKrC   aeiou_vowelsbcdfghjklmnpqrstvwxyz_consonants   lengthc                     d}t          |           D ]1}|dz  dk    rt          }nt          }|t          j        |          z  }2|S )z<Generate a random word-like string.

    :meta private:
        r   )rangerr   rp   randomchoice)rt   rF   its       r2   rwordr}      sR    
 	A6]]  q5A::AAA	V]1HrC      c                 Z    d                     d t          |           D                       S )z@Generate a random sentence-like string.

    :meta private:
    rM   c              3   Z   K   | ]&}t          t          j        d d                    V  'dS )r~   	   N)r}   ry   randint).0r{   s     r2   	<genexpr>zrsentence.<locals>.<genexpr>   s6      GGAE&.A..//GGGGGGrC   )r"   rx   )rt   s    r2   	rsentencer      s+    
 88GGvGGGGGGrC     num_elementsc           	         g d}g }t          |           D ]}t          j        dd          }|dk    r-t          j        |          }|                    d|z             J|dk    r6|                    t          t          j        dd                               |dk    r,t          j        |          }|                    d|z             d	d
                    |          z   dz   S )zDRandomly generate an invalid HTML document.

    :meta private:
    )pdivspanr{   bscripttabler      z<%s>   r~   rw   z</%s>z<html>
z</html>)rx   ry   r   rz   r!   r   r"   )r   	tag_nameselementsr{   rz   tag_names         r2   rdocr      s    
 BAAIH<   0 01%%Q;;}Y//HOOFX-....q[[OOIfnQ&:&:;;<<<<q[[}Y//HOOGh.///dii)))I55rC   順 c                 6   t          dt          z             t          |           }t          dt          |          z             dddgddfD ]}d}	 t	          j                    }t          ||           t	          j                    }d}n5# t          $ r( t          d	|z             t          j                     Y nw xY w|rt          d
|||z
  fz             ddl	m
} t	          j                    }|                    |           t	          j                    }t          d||z
  z             ddl}|                                }t	          j                    }|                    |           t	          j                    }t          d||z
  z             dS )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      s   	>LNNND	@3t99LNNN 0*mL Q Q	"	A$,,,	AGG 	" 	" 	"3kACCC!!!!!	"  	Q7;A:NNPPP	A	JJt	A	1QU;===OOO  ""F	A
LL	A	5Q?AAAAAs   8B/B>=B>r   r/   c                 2   t          j                    }|j        }t          |           }t	          t
          ||          }t          j        d|||           t          j	        |          }|
                    d           |                    dd           dS )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      s    ,..JHDCd6222DO5tT8LLLL""E	\"""	or*****rC   __main__)r   r   r   Nre   )rs   )r~   )r   )r   )r   r   )-ri   __license__r   ior   html.parserr   r   r   r   bs4.builderr   typingr	   r
   r   r   r   r   bs4._typingr   r   ry   r   r   r)   r   r3   rj   rB   rE   r$   rn   rp   __annotations__rr   intr}   r   r   r   r   rf   stdinr   rk   rC   r2   <module>r      s   C C C         " " " " " " 



 * * * * * * * * ( ( ( ( ( (                 ,++++++         



5 5 5 5pD D& Dd DS DT D D D D.)  )  )  )  ) z )  )  ) X	3 	4 	 	 	 	    *S * * * # c    H Hc H# H H H H6 6s 6c 6 6 6 6, B  BC  BT  B  B  B  BF+ +# + + + + + +  zHSY^^ rC   