U
    xh                     @   s  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d	 Zd#ddZG dd deZdd ZdZdZd$ddZd%ddZd&ddZd'ddZd(d d!Zed"kreej   dS ))z=Diagnostic functions, mainly for use when doing tech support.MIT    N)BytesIO)
HTMLParser)BeautifulSoup__version__)builder_registryc           
      C   s  t dt  t dtj  dddg}|D ]4}tjD ]}||jkr2 q(q2|| t d|  q(d|kr|d z*dd	l	m
} t d
dtt|j  W n* tk
r } zt d W 5 d}~X Y nX d|krzddl}t d|j  W n, tk
r } zt d W 5 d}~X Y nX t| dr,|  } |D ]}t d|  d}zt| |d}	d}W n8 tk
r } zt d|  t  W 5 d}~X Y nX |rt d|  t |	  t d q0dS )zDiagnostic 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.zlxml-xmlr   etreezFound lxml version %s.z.lxml is not installed or couldn't be imported.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)
dataZbasic_parsersnameZbuilderr   er	   parsersuccesssoup r$   T/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/bs4/diagnose.pydiagnose   sZ    





r&   Tc                 K   sp   ddl m} |dd}t| tr,| d} t| }|j|f||d|D ]\}}td||j	|j
f  qLd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%s, %4s, %sN)r
   r   pop
isinstancer   encoder   Z	iterparser   tagtext)r   r)   kwargsr   r'   readereventelementr$   r$   r%   
lxml_traceN   s    

 r3   c                   @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zd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`.
    c                 C   s   t | d S )N)r   )selfsr$   r$   r%   _pl   s    zAnnouncingParser._pc                 C   s   |  d|  d S )Nz%s STARTr7   )r5   r   attrsr$   r$   r%   handle_starttago   s    z AnnouncingParser.handle_starttagc                 C   s   |  d|  d S )Nz%s ENDr8   r5   r   r$   r$   r%   handle_endtagr   s    zAnnouncingParser.handle_endtagc                 C   s   |  d|  d S )Nz%s DATAr8   r5   r   r$   r$   r%   handle_datau   s    zAnnouncingParser.handle_datac                 C   s   |  d|  d S )Nz
%s CHARREFr8   r;   r$   r$   r%   handle_charrefx   s    zAnnouncingParser.handle_charrefc                 C   s   |  d|  d S )Nz%s ENTITYREFr8   r;   r$   r$   r%   handle_entityref{   s    z!AnnouncingParser.handle_entityrefc                 C   s   |  d|  d S )Nz
%s COMMENTr8   r=   r$   r$   r%   handle_comment~   s    zAnnouncingParser.handle_commentc                 C   s   |  d|  d S )Nz%s DECLr8   r=   r$   r$   r%   handle_decl   s    zAnnouncingParser.handle_declc                 C   s   |  d|  d S )Nz%s UNKNOWN-DECLr8   r=   r$   r$   r%   unknown_decl   s    zAnnouncingParser.unknown_declc                 C   s   |  d|  d S )Nz%s PIr8   r=   r$   r$   r%   	handle_pi   s    zAnnouncingParser.handle_piN)__name__
__module____qualname____doc__r7   r:   r<   r>   r?   r@   rA   rB   rC   rD   r$   r$   r$   r%   r4   d   s   r4   c                 C   s   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)r4   feed)r   r!   r$   r$   r%   htmlparser_trace   s    rJ   ZaeiouZbcdfghjklmnpqrstvwxyz   c                 C   s:   d}t | D ](}|d dkr"t}nt}|t|7 }q|S )z#Generate a random word-like string.    r   )range_consonants_vowelsrandomchoice)lengthr6   itr$   r$   r%   rword   s    rV      c                 C   s   d dd t| D S )z'Generate a random sentence-like string. c                 s   s   | ]}t td dV  qdS )rW   	   N)rV   rQ   randint).0rT   r$   r$   r%   	<genexpr>   s     zrsentence.<locals>.<genexpr>)r   rN   )rS   r$   r$   r%   	rsentence   s    r]     c                 C   s   dddddddg}g }t | D ]r}tdd	}|dkrPt|}|d
|  q|dkrp|ttdd q|dkrt|}|d|  qdd| d S )z+Randomly generate an invalid HTML document.pdivspanrT   bscripttabler      z<%s>   rW   rM   z</%s>z<html>
z</html>)rN   rQ   rZ   rR   r   r]   r   )num_elementsZ	tag_nameselementsrT   rR   Ztag_namer$   r$   r%   rdoc   s    

rj   順 c           
      C   s$  t dt  t| }t dt|  dddgddfD ]z}d}z"t }t||}t }d}W n6 tk
r } zt d	|  t  W 5 d
}~X Y nX |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   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   rj   lentimer   r   r   r   r
   r   HTMLr	   r   parse)
rh   r   r!   r"   ar#   rb   r    r   r	   r$   r$   r%   benchmark_parsers   s4    


rq   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|bs42   N)tempfileNamedTemporaryFiler   rj   dictrr   cProfileZrunctxpstatsZStatsZ
sort_statsZprint_stats)rh   r!   Z
filehandlefilenamer   varsstatsr$   r$   r%   profile   s    

r|   __main__)T)rK   )rW   )r^   )rk   )rk   r
   )!rH   __license__rw   ior   html.parserr   rr   r   r   Zbs4.builderr   osrx   rQ   rt   rm   r   r   r&   r3   r4   rJ   rP   rO   rV   r]   rj   rq   r|   rE   stdinr   r$   r$   r$   r%   <module>   s8   8
&



 

