a
    (ñ»j¦  ã                   @   s„  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dœdd„Zd-d
eeddœdd„ZG dd„ deƒZeddœdd„Z dZ!ee"d< dZ#ee"d< d.e$edœdd„Z%d/e$edœdd „Z&d0e$ed"œd#d$„Z'd1e$dd"œd&d'„Z(d2e$edd)œd*d+„Z)e*d,k�r€eej+ ,¡ ƒ dS )3z=Diagnostic functions, mainly for use when doing tech support.ÚMITé    N)ÚBytesIO)Ú
HTMLParser)ÚBeautifulSoupÚ__version__)Úbuilder_registry)ÚAnyÚIOÚListÚOptionalÚTupleÚTYPE_CHECKING)Ú_IncomingMarkupr   ©ÚdataÚreturnc           	   	   C   sŠ  t dt ƒ t dtj ƒ g d¢}|D ]4}tjD ]}||jv r0 q&q0| |¡ t d| ƒ q&d|v r´| d¡ z*ddl	m
} t d	d
 tt|jƒ¡ ƒ W n ty²   t dƒ Y n0 d|v ròzddl}t d|j ƒ W n tyð   t dƒ Y n0 t| dƒ�r|  ¡ } |D ]z}t d| ƒ d}zt| |d�}d}W n( t�yZ   t d| ƒ t ¡  Y n0 |�rzt d| ƒ t | ¡ ƒ t dƒ �q
dS )z­Diagnostic 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   Zbuildersr   ÚremoveÚappendr   r   ÚjoinÚmapÚstrZLXML_VERSIONÚImportErrorr   Úhasattrr   r   Ú	ExceptionÚ	tracebackÚ	print_excZprettify)	r   Zbasic_parsersÚnameÚbuilderr   r   ÚparserÚsuccessZsoup© r,   ú2E:\soccer\ml_env\Lib\site-packages\bs4/diagnose.pyÚdiagnose    sN    


ÿ
r.   T)r   ÚhtmlÚkwargsr   c                 K   sz   ddl m} | dd¡}t| tƒr,|  d¡} t| tƒs>t| ƒ}|j|f||dœ|¤ŽD ]\}}t	d||j
|jf ƒ qVd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)r/   r1   z%s, %4s, %sN)r   r   ÚpopÚ
isinstancer"   Úencoder	   r   Z	iterparser   ÚtagÚtext)r   r/   r0   r   r1   ÚreaderÚeventÚelementr,   r,   r-   Ú
lxml_traceX   s    


 r;   c                   @   sÊ   e Zd ZdZeddœdd„Zdeeeeee f  e	ddœdd	„Z
dee	dd
œdd„Zeddœdd„Zeddœdd„Zeddœdd„Zeddœdd„Zeddœdd„Zeddœdd„Zeddœd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`.
    N)Úsr   c                 C   s   t |ƒ d S )N)r   )Úselfr=   r,   r,   r-   Ú_pw   s    zAnnouncingParser._pT)r(   ÚattrsÚhandle_empty_elementr   c                 C   s   |   |› d|› d�¡ d S )Nú z START©r?   )r>   r(   r@   rA   r,   r,   r-   Úhandle_starttagz   s    z AnnouncingParser.handle_starttag)r(   Úcheck_already_closedr   c                 C   s   |   d| ¡ d S )Nz%s ENDrC   )r>   r(   rE   r,   r,   r-   Úhandle_endtag‚   s    zAnnouncingParser.handle_endtagr   c                 C   s   |   d| ¡ d S )Nz%s DATArC   ©r>   r   r,   r,   r-   Úhandle_data…   s    zAnnouncingParser.handle_data)r(   r   c                 C   s   |   d| ¡ d S )Nz
%s CHARREFrC   ©r>   r(   r,   r,   r-   Úhandle_charrefˆ   s    zAnnouncingParser.handle_charrefc                 C   s   |   d| ¡ d S )Nz%s ENTITYREFrC   rI   r,   r,   r-   Úhandle_entityref‹   s    z!AnnouncingParser.handle_entityrefc                 C   s   |   d| ¡ d S )Nz
%s COMMENTrC   rG   r,   r,   r-   Úhandle_commentŽ   s    zAnnouncingParser.handle_commentc                 C   s   |   d| ¡ d S )Nz%s DECLrC   rG   r,   r,   r-   Úhandle_decl‘   s    zAnnouncingParser.handle_declc                 C   s   |   d| ¡ d S )Nz%s UNKNOWN-DECLrC   rG   r,   r,   r-   Úunknown_decl”   s    zAnnouncingParser.unknown_declc                 C   s   |   d| ¡ d S )Nz%s PIrC   rG   r,   r,   r-   Ú	handle_pi—   s    zAnnouncingParser.handle_pi)T)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r?   r
   r   r   ÚboolrD   rF   rH   rJ   rK   rL   rM   rN   rO   r,   r,   r,   r-   r<   o   s"    üûr<   c                 C   s   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*   r,   r,   r-   Úhtmlparser_trace›   s    rV   ZaeiouÚ_vowelsZbcdfghjklmnpqrstvwxyzÚ_consonantsé   )Úlengthr   c                 C   s:   d}t | ƒD ](}|d dkr"t}nt}|t |¡7 }q|S )z<Generate a random word-like string.

    :meta private:
    Ú é   r   )ÚrangerX   rW   ÚrandomÚchoice)rZ   r=   ÚiÚtr,   r,   r-   Úrword«   s    rb   é   c                 C   s   d  dd„ t| ƒD ƒ¡S )z@Generate a random sentence-like string.

    :meta private:
    rB   c                 s   s   | ]}t t d d¡ƒV  qdS )rc   é	   N)rb   r^   Úrandint)Ú.0r`   r,   r,   r-   Ú	<genexpr>¿   ó    zrsentence.<locals>.<genexpr>)r    r]   )rZ   r,   r,   r-   Ú	rsentenceº   s    ri   éè  )Únum_elementsr   c                 C   sš   g d¢}g }t | ƒD ]r}t dd¡}|dkrFt |¡}| d| ¡ q|dkrf| tt dd¡ƒ¡ q|dkrt |¡}| d| ¡ qd	d
 |¡ d S )zDRandomly generate an invalid HTML document.

    :meta private:
    )ÚpÚdivÚspanr`   ÚbÚscriptÚtabler   é   z<%s>é   rc   r\   z</%s>z<html>Ú
z</html>)r]   r^   re   r_   r   ri   r    )rk   Z	tag_namesÚelementsr`   r_   Ztag_namer,   r,   r-   ÚrdocÂ   s    

rv   é † c           	   	   C   s  t dt ƒ t| ƒ}t dt|ƒ ƒ dddgddfD ]j}d}z"t ¡ }t||ƒ t ¡ }d}W n& ty„   t d	| ƒ t ¡  Y n0 |r4t d
||| f ƒ q4ddl	m
} t ¡ }| |¡ t ¡ }t d||  ƒ ddl}| ¡ }t ¡ }| |¡ t ¡ }t d||  ƒ 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   r/   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   rv   ÚlenÚtimer   r%   r&   r'   r   r   ÚHTMLr   r   Úparse)	rk   r   Zparser_namer+   Úaro   r   r   r*   r,   r,   r-   Úbenchmark_parsersØ   s4    


r}   r   )rk   r*   r   c                 C   sX   t  ¡ }|j}t| ƒ}tt||d�}t d|||¡ t 	|¡}| 
d¡ | dd¡ dS )z7Use Python's profiler on a randomly generated document.)Úbs4r   r*   zbs4.BeautifulSoup(data, parser)Z
cumulativez_html5lib|bs4é2   N)ÚtempfileÚNamedTemporaryFiler(   rv   Údictr~   ÚcProfileZrunctxÚpstatsZStatsZ
sort_statsZprint_stats)rk   r*   Z
filehandleÚfilenamer   ÚvarsÚstatsr,   r,   r-   Úprofileû   s    

rˆ   Ú__main__)T)rY   )rc   )rj   )rw   )rw   r   )-rS   Ú__license__rƒ   Úior   Úhtml.parserr   r~   r   r   Zbs4.builderr   Útypingr   r	   r
   r   r   r   Zbs4._typingr   r„   r^   r€   ry   r&   r   r.   rT   r;   r<   r"   rV   rW   Ú__annotations__rX   Úintrb   ri   rv   r}   rˆ   rP   Ústdinr   r,   r,   r,   r-   Ú<module>   s:    	8,#
