Ë
    þ)f  ã                   ó6  — 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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lZd„ Zdd	„Z G d
„ de«      Zd„ ZdZdZdd„Zdd„Zdd„Zdd„Zdd„Zedk(  r! eej>                  jA                  «       «       yy)z=Diagnostic functions, mainly for use when doing tech support.ÚMITé    N)ÚBytesIO)Ú
HTMLParser)ÚBeautifulSoupÚ__version__)Úbuilder_registryc           	      óÄ  — t        dt        z  «       t        dt        j                  z  «       g d¢}|D ]F  }t        j
                  D ]  }||j                  v sŒ Œ' |j                  |«       t        d|z  «       ŒH d|v rM|j                  d«       	 ddl	m
} t        d	d
j                  t        t        |j                  «      «      z  «       d|v r	 ddl}t        d|j                  z  «       t#        | d«      r| j%                  «       } |D ]V  }t        d|z  «       d}	 t'        | |¬«      }	d}|r't        d|z  «       t        	j/                  «       «       t        d«       ŒX y# t        $ r}t        d«       Y d}~Œ²d}~ww xY w# t        $ r}t        d«       Y d}~Œ²d}~ww xY w# t(        $ r,}t        d|z  «       t+        j,                  «        Y d}~Œ©d}~ww xY w)z¼Diagnostic suite for isolating common problems.

    :param data: A string containing 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.Nr   z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)
ÚdataÚbasic_parsersÚnameÚbuilderr   Úer   ÚparserÚsuccessÚsoups
             úI/var/www/html/flask-app/venv/lib/python3.12/site-packages/bs4/diagnose.pyÚdiagnoser,      sÞ  € ô 
Ð4´{ÑBÔDÜ	Ð¤§¡Ñ,Ô.â7€MØò ˆÜ'×0Ñ0ò 	ˆGØ�w×'Ñ'Ò'Ùð	ð × Ñ  Ô&ÜØMØñõðð �ÑØ×Ñ˜ZÔ(ð	BÝ"ÜÐ*¨S¯X©X´c¼#¸e×>PÑ>PÓ6QÓ-RÑRÔTð �]Ñ"ð	FÛÜÐ.°×1EÑ1EÑEÔGô
 ˆt�VÔØ�y‰y‹{ˆàò ˆÜÐ4°vÑ=Ô?Øˆð	"Ü  °Ô7ˆDØˆGñ ÜÐ8¸6ÑAÔCÜ�4—=‘=“?Ô$äˆxÕñøô! ò 	BÜØ@÷Bñ Bûð	Bûô ò 	FÜØD÷Fñ Fûð	Fûô ò 	"ÜÐ3°fÑ<Ô>Ü×Ñ×!Ñ!ûð	"úsH   Â;E( ÃF	 Ä"F*Å(	FÅ1FÆFÆ		F'ÆF"Æ"F'Æ*	GÆ3"GÇGc                 ó  — ddl m} |j                  dd«      }t        | t        «      r| j                  d«      } t        | «      } |j                  |f||dœ|¤ŽD ]-  \  }}t        |›d|j                  d›d|j                  ›�«       Œ/ y	)
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)Úhtmlr.   z, z>4N)r   r   ÚpopÚ
isinstancer   Úencoder   Ú	iterparser   ÚtagÚtext)r#   r0   Úkwargsr   r.   ÚreaderÚeventÚelements           r+   Ú
lxml_tracer;   N   s†   € õ Ø�j‰j˜ DÓ)€GÜ�$œÔØ�{‰{˜6Ó"ˆÜ�T‹]€FØ)˜%Ÿ/™/ØðØ 7ñØ.4ñò D‰ˆˆwô 	¢ w§{¤{°G·L²LÐAÕCñDó    c                   óL   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zy)ÚAnnouncingParserzèSubclass 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`.
    c                 ó   — t        |«       y )N)r   )ÚselfÚss     r+   Ú_pzAnnouncingParser._pl   s	   € Üˆa�r<   c                 ó,   — | j                  d|z  «       y )Nz%s START©rB   )r@   r%   Úattrss      r+   Úhandle_starttagz AnnouncingParser.handle_starttago   s   € Ø�‰�
˜TÑ!Õ"r<   c                 ó,   — | j                  d|z  «       y )Nz%s ENDrD   ©r@   r%   s     r+   Úhandle_endtagzAnnouncingParser.handle_endtagr   s   € Ø�‰�˜4‘Õ r<   c                 ó,   — | j                  d|z  «       y )Nz%s DATArD   ©r@   r#   s     r+   Úhandle_datazAnnouncingParser.handle_datau   ó   € Ø�‰�	˜DÑ Õ!r<   c                 ó,   — | j                  d|z  «       y )Nz
%s CHARREFrD   rH   s     r+   Úhandle_charrefzAnnouncingParser.handle_charrefx   ó   € Ø�‰�˜tÑ#Õ$r<   c                 ó,   — | j                  d|z  «       y )Nz%s ENTITYREFrD   rH   s     r+   Úhandle_entityrefz!AnnouncingParser.handle_entityref{   s   € Ø�‰� Ñ%Õ&r<   c                 ó,   — | j                  d|z  «       y )Nz
%s COMMENTrD   rK   s     r+   Úhandle_commentzAnnouncingParser.handle_comment~   rP   r<   c                 ó,   — | j                  d|z  «       y )Nz%s DECLrD   rK   s     r+   Úhandle_declzAnnouncingParser.handle_decl�   rM   r<   c                 ó,   — | j                  d|z  «       y )Nz%s UNKNOWN-DECLrD   rK   s     r+   Úunknown_declzAnnouncingParser.unknown_decl„   s   € Ø�‰Ð! DÑ(Õ)r<   c                 ó,   — | j                  d|z  «       y )Nz%s PIrD   rK   s     r+   Ú	handle_pizAnnouncingParser.handle_pi‡   s   € Ø�‰�˜$‘Õr<   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rB   rF   rI   rL   rO   rR   rT   rV   rX   rZ   © r<   r+   r>   r>   d   s9   „ ñòò#ò!ò"ò%ò'ò%ò"ò*ó r<   r>   c                 ó:   — t        «       }|j                  | «       y)zÂPrint 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)r>   Úfeed)r#   r(   s     r+   Úhtmlparser_tracerb   Š   s   € ô Ó€FØ
‡K�K�Õr<   ÚaeiouÚbcdfghjklmnpqrstvwxyzc                 ó„   — d}t        | «      D ]/  }|dz  dk(  rt        }nt        }|t        j                  |«      z  }Œ1 |S )z#Generate a random word-like string.Ú é   r   )ÚrangeÚ_consonantsÚ_vowelsÚrandomÚchoice)ÚlengthrA   ÚiÚts       r+   Úrwordrp   ˜   sI   € à
€AÜ�6‹]ò ˆØˆq‰5�AŠ:Ü‰AäˆAØ	ŒV�]‰]˜1ÓÑ‰ðð €Hr<   c                 óD   — dj                  d„ t        | «      D «       «      S )z'Generate a random sentence-like string.ú c              3   óZ   K  — | ]#  }t        t        j                  d d«      «      –— Œ% y­w)é   é	   N)rp   rk   Úrandint)Ú.0rn   s     r+   ú	<genexpr>zrsentence.<locals>.<genexpr>¥   s    è ø€ ÒF°1”Eœ&Ÿ.™.¨¨1Ó-×.ÑFùs   ‚)+)r   rh   )rm   s    r+   Ú	rsentencery   £   s   € à�8‰8ÑF¼¸f»ÔFÓFÐFr<   c           	      ó¬  — g d¢}g }t        | «      D ]ª  }t        j                  dd«      }|dk(  r*t        j                  |«      }|j	                  d|z  «       ŒH|dk(  r/|j	                  t        t        j                  dd«      «      «       Œ||dk(  sŒ‚t        j                  |«      }|j	                  d|z  «       Œ¬ d	d
j                  |«      z   dz   S )z+Randomly generate an invalid HTML document.)ÚpÚdivÚspanrn   ÚbÚscriptÚtabler   é   z<%s>é   rt   rg   z</%s>z<html>ú
z</html>)rh   rk   rv   rl   r   ry   r   )Únum_elementsÚ	tag_namesÚelementsrn   rl   Útag_names         r+   Úrdocrˆ   §   sº   € âA€IØ€HÜ�<Ó ò 0ˆÜ—‘  !Ó$ˆØ�QŠ;ä—}‘} YÓ/ˆHØ�O‰O˜F XÑ-Õ.Ø�qŠ[Ø�O‰OœI¤f§n¡n°Q°qÓ&9Ó:Õ;Ø�q‹[ä—}‘} YÓ/ˆHØ�O‰O˜G hÑ.Õ/ð0ð �d—i‘i Ó)Ñ)¨IÑ5Ð5r<   c                 óð  — t        dt        z  «       t        | «      }t        dt        |«      z  «       dddgddfD ]Q  }d}	 t	        j                  «       }t        ||«      }t	        j                  «       }d}|sŒ?t        d|z
  fz  «       ŒS ddl	m
} t	        j                  «       }|j                  |«       t	        j                  «       }t        d||z
  z  «       dd
l}	|	j                  «       }t	        j                  «       }|j                  |«       t	        j                  «       }t        d||z
  z  «       y
# t        $ r,}t        d	|z  «       t        j                  «        Y d
}~Œ÷d
}~ww xY w)z.Very basic head-to-head performance benchmark.z1Comparative parser benchmark on Beautiful Soup %sz3Generated a large invalid HTML document (%d bytes).r   r0   r   r
   FTr   Nz"BS4+%s parsed the markup in %.2fs.r   r   z$Raw lxml parsed the markup in %.2fs.z(Raw html5lib parsed the markup in %.2fs.)r   r   rˆ   ÚlenÚtimer   r   r    r!   r   r   ÚHTMLr   r   Úparse)
r„   r#   r(   r)   Úar*   r~   r'   r   r   s
             r+   Úbenchmark_parsersr�   ¹   sD  € ä	Ð>ÄÑLÔNÜ�Ó€DÜ	Ð@Ä3ÀtÃ9ÑLÔNà˜F FÐ+¨Z¸ÐGò JˆØˆð	"Ü—	‘	“ˆAÜ   vÓ.ˆDÜ—	‘	“ˆAØˆGò ÜÐ7¸6À1ÀQÁ3¸-ÑGÕIðJõ Ü�	‰	‹€AØ	‡J�JˆtÔÜ�	‰	‹€AÜ	Ð1°Q°q±SÑ9Ô;ãØ× Ñ Ó"€FÜ�	‰	‹€AØ
‡L�L�ÔÜ�	‰	‹€AÜ	Ð5¸¸1¹Ñ=Õ?øô# ò 	"ÜÐ3°fÑ<Ô>Ü×Ñ×!Ñ!ûð	"ús   Á6E Å 	E5Å	"E0Å0E5c                 ó  — t        j                  «       }|j                  }t        | «      }t	        t
        ||¬«      }t        j                  d|||«       t        j                  |«      }|j                  d«       |j                  dd«       y)z7Use Python's profiler on a randomly generated document.)Úbs4r#   r(   zbs4.BeautifulSoup(data, parser)Ú
cumulativez_html5lib|bs4é2   N)ÚtempfileÚNamedTemporaryFiler%   rˆ   Údictr‘   ÚcProfileÚrunctxÚpstatsÚStatsÚ
sort_statsÚprint_stats)r„   r(   Ú
filehandleÚfilenamer#   ÚvarsÚstatss          r+   Úprofiler¡   Ù   sp   € ä×,Ñ,Ó.€JØ�‰€Hä�Ó€DÜ”C˜d¨6Ô2€DÜ‡O�OÐ5¸¸dÀHÔMä�L‰L˜Ó"€Eà	×Ñ�\Ô"Ø	×Ñ�o rÕ*r<   Ú__main__)T)é   )rt   )iè  )é † )r¤   r   )!r^   Ú__license__r—   Úior   Úhtml.parserr   r‘   r   r   Úbs4.builderr   Úosr™   rk   r”   r‹   r    r   r,   r;   r>   rb   rj   ri   rp   ry   rˆ   r�   r¡   r[   Ústdinr   r_   r<   r+   ú<module>r«      s¡   ðÙ Cð €ã Ý Ý "Û 
ß *Ý (ã 	Û Û Û Û Û Û 
Û ò6ópDô,$ �zô $ òL	ð €Ø%€ó	óGó6ó$@ó@+ð ˆzÒÙˆS�Y‰Y�^‰^ÓÕð r<   