§
     Mºf  ã                   óF  — 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                              ¦   «         ¦  «         dS dS )!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 ]C}t          j        D ]}||j        v r n(Œ|                     |¦  «         t          d|z  ¦  «         ŒDd|v r€|                     d¦  «         	 ddl	m
} t          d	d
                     t          t          |j        ¦  «        ¦  «        z  ¦  «         n&# t          $ r}t          d¦  «         Y d}~nd}~ww xY wd|v rC	 ddl}t          d|j        z  ¦  «         n&# t          $ r}t          d¦  «         Y d}~nd}~ww xY wt#          | d¦  «        r|                      ¦   «         } |D ]«}t          d|z  ¦  «         d}	 t'          | |¬¦  «        }	d}n<# t(          $ r/}t          d|z  ¦  «         t+          j        ¦   «          Y d}~nd}~ww xY w|r3t          d|z  ¦  «         t          |	                     ¦   «         ¦  «         t          d¦  «         Œ¬dS )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
             úK/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/bs4/diagnose.pyÚdiagnoser,      sþ  € õ 
Ð4µ{ÑBÑDÔDÐDÝ	Ð¥¤Ñ,Ñ.Ô.Ð.à7Ð7Ð7€MØð ð ˆÝ'Ô0ð 	ð 	ˆGØ�wÔ'Ð'Ð'Ø�ð (ð × Ò  Ñ&Ô&Ð&ÝØMØññô ð øð �ÐÐØ×Ò˜ZÑ(Ô(Ð(ð	BØ"Ð"Ð"Ð"Ð"Ð"ÝÐ*¨S¯XªXµc½#¸eÔ>PÑ6QÔ6QÑ-RÔ-RÑRÑTÔTÐTÐTøÝð 	Bð 	Bð 	BÝØ@ñBô Bð Bð Bð Bð Bð Bð Bøøøøð	Bøøøð
 �]Ð"Ð"ð	FØˆOˆOˆOÝÐ.°Ô1EÑEÑGÔGÐGÐGøÝð 	Fð 	Fð 	FÝØDñFô Fð Fð Fð Fð Fð Fð Føøøøð	Føøøõ ˆt�VÑÔð Ø�yŠy‰{Œ{ˆàð ð ˆÝÐ4°vÑ=Ñ?Ô?Ð?Øˆð	"Ý  °Ð7Ñ7Ô7ˆDØˆGˆGøÝð 	"ð 	"ð 	"ÝÐ3°fÑ<Ñ>Ô>Ð>ÝÔÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!øøøøð	"øøøð ð 	%ÝÐ8¸6ÑAÑCÔCÐCÝ�4—=’=‘?”?Ñ$Ô$Ð$åˆxÑÔÐÐðð sI   ÂAC Ã
C?Ã&C:Ã:C?ÄD# Ä#
EÄ-EÅEÆFÆ
GÆ$%GÇGTc                 ó"  — ddl m} |                     dd¦  «        }t          | t          ¦  «        r|                      d¦  «        } 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)Ú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ð D‰ˆˆwõ 	    w¤{ { { {°G´L°LÐAÑCÔCÐCÐCðDð Dó    c                   óN   — 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dS )Ú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          |¦  «         d S )N)r   )ÚselfÚss     r+   Ú_pzAnnouncingParser._pl   s   € Ýˆa‰Œˆˆˆr<   c                 ó6   — |                       d|z  ¦  «         d S )Nz%s START©rB   )r@   r%   Úattrss      r+   Úhandle_starttagz AnnouncingParser.handle_starttago   s   € Ø�Š�
˜TÑ!Ñ"Ô"Ð"Ð"Ð"r<   c                 ó6   — |                       d|z  ¦  «         d S )Nz%s ENDrD   ©r@   r%   s     r+   Úhandle_endtagzAnnouncingParser.handle_endtagr   s   € Ø�Š�˜4‘Ñ Ô Ð Ð Ð r<   c                 ó6   — |                       d|z  ¦  «         d S )Nz%s DATArD   ©r@   r#   s     r+   Úhandle_datazAnnouncingParser.handle_datau   ó   € Ø�Š�	˜DÑ Ñ!Ô!Ð!Ð!Ð!r<   c                 ó6   — |                       d|z  ¦  «         d S )Nz
%s CHARREFrD   rH   s     r+   Úhandle_charrefzAnnouncingParser.handle_charrefx   ó   € Ø�Š�˜tÑ#Ñ$Ô$Ð$Ð$Ð$r<   c                 ó6   — |                       d|z  ¦  «         d S )Nz%s ENTITYREFrD   rH   s     r+   Úhandle_entityrefz!AnnouncingParser.handle_entityref{   s   € Ø�Š� Ñ%Ñ&Ô&Ð&Ð&Ð&r<   c                 ó6   — |                       d|z  ¦  «         d S )Nz
%s COMMENTrD   rK   s     r+   Úhandle_commentzAnnouncingParser.handle_comment~   rP   r<   c                 ó6   — |                       d|z  ¦  «         d S )Nz%s DECLrD   rK   s     r+   Úhandle_declzAnnouncingParser.handle_decl�   rM   r<   c                 ó6   — |                       d|z  ¦  «         d S )Nz%s UNKNOWN-DECLrD   rK   s     r+   Úunknown_declzAnnouncingParser.unknown_decl„   s    € Ø�ŠÐ! DÑ(Ñ)Ô)Ð)Ð)Ð)r<   c                 ó6   — |                       d|z  ¦  «         d S )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   s´   € € € € € ðð ðð ð ð#ð #ð #ð!ð !ð !ð"ð "ð "ð%ð %ð %ð'ð 'ð 'ð%ð %ð %ð"ð "ð "ð*ð *ð *ð ð  ð  ð  ð  r<   r>   c                 óL   — t          ¦   «         }|                     | ¦  «         dS )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Úbcdfghjklmnpqrstvwxyzé   c                 óŒ   — d}t          | ¦  «        D ]1}|dz  dk    rt          }nt          }|t          j        |¦  «        z  }Œ2|S )z#Generate a random word-like string.Ú é   r   )ÚrangeÚ_consonantsÚ_vowelsÚrandomÚchoice)ÚlengthrA   ÚiÚts       r+   Úrwordrq   ˜   sP   € à
€AÝ�6‰]Œ]ð ð ˆØˆq‰5�AŠ:ˆ:ÝˆAˆAåˆAØ	�VŒ]˜1ÑÔÑˆˆØ€Hr<   é   c                 óZ   — d                      d„ t          | ¦  «        D ¦   «         ¦  «        S )z'Generate a random sentence-like string.ú c              3   óZ   K  — | ]&}t          t          j        d d¦  «        ¦  «        V — Œ'dS )rr   é	   N)rq   rl   Úrandint)Ú.0ro   s     r+   ú	<genexpr>zrsentence.<locals>.<genexpr>¥   s6   è è € ÐFÐF°1•E�&œ.¨¨1Ñ-Ô-Ñ.Ô.ÐFÐFÐFÐFÐFÐFr<   )r   ri   )rn   s    r+   Ú	rsentencerz   £   s)   € à�8Š8ÐFÐF½¸f¹¼ÐFÑFÔFÑFÔFÐFr<   éè  c           	      óÔ  — 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 )z+Randomly generate an invalid HTML document.)ÚpÚdivÚspanro   ÚbÚscriptÚtabler   é   z<%s>é   rr   rh   z</%s>z<html>ú
z</html>)ri   rl   rw   rm   r   rz   r   )Únum_elementsÚ	tag_namesÚelementsro   rm   Útag_names         r+   ÚrdocrŠ   §   sê   € àAÐAÐA€IØ€HÝ�<Ñ Ô ð 0ð 0ˆÝ”  !Ñ$Ô$ˆØ�QŠ;ˆ;å”} YÑ/Ô/ˆHØ�OŠO˜F XÑ-Ñ.Ô.Ð.Ð.Ø�qŠ[ˆ[Ø�OŠO�I¥f¤n°Q°qÑ&9Ô&9Ñ:Ô:Ñ;Ô;Ð;Ð;Ø�qŠ[ˆ[å”} YÑ/Ô/ˆHØ�OŠO˜G hÑ.Ñ/Ô/Ð/øØ�d—i’i Ñ)Ô)Ñ)¨IÑ5Ð5r<   é † c                 óD  — t          dt          z  ¦  «         t          | ¦  «        }t          dt          |¦  «        z  ¦  «         dddgddfD ]“}d}	 t	          j        ¦   «         }t          ||¦  «        }t	          j        ¦   «         }d}n<# t          $ r/}t          d	|z  ¦  «         t          j        ¦   «          Y d
}~nd
}~w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   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’   ¹   s½  € å	Ð>ÅÑLÑNÔNÐNÝ�ÑÔ€DÝ	Ð@Å3ÀtÁ9Ä9ÑLÑNÔNÐNà˜F FÐ+¨Z¸ÐGð Jð JˆØˆð	"Ý”	‘”ˆAÝ   vÑ.Ô.ˆDÝ”	‘”ˆAØˆGˆGøÝð 	"ð 	"ð 	"ÝÐ3°fÑ<Ñ>Ô>Ð>ÝÔÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!øøøøð	"øøøð ð 	JÝÐ7¸6À1ÀQÁ3¸-ÑGÑIÔIÐIøàÐÐÐÐÐÝŒ	‰Œ€AØ	‡J‚JˆtÑÔÐÝŒ	‰Œ€AÝ	Ð1°Q°q±SÑ9Ñ;Ô;Ð;à€O€O€OØ× Ò Ñ"Ô"€FÝŒ	‰Œ€AØ
‡L‚L�ÑÔÐÝŒ	‰Œ€AÝ	Ð5¸¸1¹Ñ=Ñ?Ô?Ð?Ð?Ð?s   Á8BÂ
CÂ%C Ã C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|bs4é2   N)ÚtempfileÚNamedTemporaryFiler%   rŠ   Údictr”   ÚcProfileÚrunctxÚpstatsÚStatsÚ
sort_statsÚprint_stats)r†   r(   Ú
filehandleÚfilenamer#   ÚvarsÚstatss          r+   Úprofiler¤   Ù   sŽ   € åÔ,Ñ.Ô.€JØŒ€Hå�ÑÔ€DÝ•C˜d¨6Ð2Ñ2Ô2€DÝ„OÐ5¸¸dÀHÑMÔMÐMåŒL˜Ñ"Ô"€Eà	×Ò�\Ñ"Ô"Ð"Ø	×Ò�o rÑ*Ô*Ð*Ð*Ð*r<   Ú__main__)T)re   )rr   )r{   )r‹   )r‹   r   )!r^   Ú__license__rš   Úior   Úhtml.parserr   r”   r   r   Úbs4.builderr   Úosrœ   rl   r—   rŽ   r    r   r,   r;   r>   rb   rk   rj   rq   rz   rŠ   r’   r¤   r[   Ústdinr   r_   r<   r+   ú<module>r¬      sÏ  ðØ CÐ Cð €à €€€Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ø 
€
€
€
Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø (Ð (Ð (Ð (Ð (Ð (à 	€	€	€	Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø €€€ð6ð 6ð 6ðpDð Dð Dð Dð,$ ð $ ð $ ð $ ð $ �zñ $ ô $ ð $ ðL	ð 	ð 	ð €Ø%€ð	ð 	ð 	ð 	ðGð Gð Gð Gð6ð 6ð 6ð 6ð$@ð @ð @ð @ð@+ð +ð +ð +ð ˆzÒÐØ€HˆSŒY�^Š^ÑÔÑÔÐÐÐð Ðr<   