
    ,h/                     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)StringIO)
HTMLParser)BeautifulSoup__version__)builder_registryc           	      0   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%                         } n| j'                  d      s| j'                  d      rt        d| z         t        d       y	 t(        j*                  j-                  |       r2t        d| z         t/        |       5 }|j%                         } ddd       t                |D ]V  }t        d|z         d}		 t3        | |      }
d}	|	r't        d|z         t        
j;                                t        d       X y# t        $ r}t        d       Y d}~Ld}~ww xY w# t        $ r}t        d       Y d}~Md}~ww xY w# 1 sw Y   xY w# t0        $ r Y w xY w# t4        $ r,}t        d|z         t7        j8                          Y d}~d}~ww xY w)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.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http:zhttps:z<"%s" looks like a URL. Beautiful Soup is not an HTTP client.zpYou need to use some other library to get the document behind the URL, and feed that document to Beautiful Soup.z7"%s" looks like a filename. Reading data from the file.z#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   
startswithospathexistsopen
ValueErrorr   	Exception	traceback	print_excprettify)databasic_parsersnamebuilderr   er   fpparsersuccesssoups              N/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/bs4/diagnose.pydiagnoser3      s{    

3k
AB	

+,7M '00 	Gw'''	   &M Z(	B")CHHSU=O=O5P,QQR ]"	F-0D0DDE
 tVyy{		!T__X%>LtST  A  	B	ww~~d#ORVVW$Z %2779D% 	 3f<=	" 7DG 7&@A$--/"h?  	B@B B	B  	FDF F	F% % 	 	  	"2V;<!!	"sr   ;H H# 
8I II ;I 	H 
HH #	I,H==II
I 	II 	J)"JJc                     ddl m}  |j                  t        |       fd|i|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   htmlz, z>4N)r   r   	iterparser   r   tagtext)r)   r5   kwargsr   eventelements         r2   
lxml_tracer<   ]   sL     )%//(4.NtNvN Dww{{GLL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)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                     t        |       y )N)r   )selfss     r2   _pzAnnouncingParser._pu   s	    ar=   c                 ,    | j                  d|z         y )Nz%s STARTrC   )rA   r+   attrss      r2   handle_starttagz AnnouncingParser.handle_starttagx   s    
T!"r=   c                 ,    | j                  d|z         y )Nz%s ENDrE   rA   r+   s     r2   handle_endtagzAnnouncingParser.handle_endtag{   s    4 r=   c                 ,    | j                  d|z         y )Nz%s DATArE   rA   r)   s     r2   handle_datazAnnouncingParser.handle_data~       	D !r=   c                 ,    | j                  d|z         y )Nz
%s CHARREFrE   rI   s     r2   handle_charrefzAnnouncingParser.handle_charref       t#$r=   c                 ,    | j                  d|z         y )Nz%s ENTITYREFrE   rI   s     r2   handle_entityrefz!AnnouncingParser.handle_entityref   s    %&r=   c                 ,    | j                  d|z         y )Nz
%s COMMENTrE   rL   s     r2   handle_commentzAnnouncingParser.handle_comment   rQ   r=   c                 ,    | j                  d|z         y )Nz%s DECLrE   rL   s     r2   handle_declzAnnouncingParser.handle_decl   rN   r=   c                 ,    | j                  d|z         y )Nz%s UNKNOWN-DECLrE   rL   s     r2   unknown_declzAnnouncingParser.unknown_decl   s    !D()r=   c                 ,    | j                  d|z         y )Nz%s PIrE   rL   s     r2   	handle_pizAnnouncingParser.handle_pi   s    $r=   N)__name__
__module____qualname____doc__rC   rG   rJ   rM   rP   rS   rU   rW   rY   r[    r=   r2   r?   r?   m   s9    #!"%'%"* r=   r?   c                 :    t               }|j                  |        y)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)r?   feed)r)   r/   s     r2   htmlparser_tracerc      s     F
KK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)lengthrB   its       r2   rwordrq      sI    
A6] q5A:AA	V]]1 Hr=   c                 V    dj                  d t        t        |             D              S )z'Generate a random sentence-like string. c              3   Z   K   | ]#  }t        t        j                  d d             % yw)   	   N)rq   rl   randint).0ro   s     r2   	<genexpr>zrsentence.<locals>.<genexpr>   s      L1E&..1-.Ls   )+)r   listri   )rn   s    r2   	rsentencer{      s     88LU6]8KLLLr=   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spanro   bscripttabler      z<%s>   ru   rh   z</%s>z<html>
z</html>)ri   rl   rw   rm   r   r{   r   )num_elements	tag_nameselementsro   rm   tag_names         r2   rdocr      s    AIH<  0!$Q;}}Y/HOOFX-.q[OOIfnnQq&9:;q[}}Y/HOOGh./0 dii))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   r5   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/   r0   ar1   r   r-   r   r   s
             r2   benchmark_parsersr      sD   	
=
KLD	
?#d)
KLFF+ZG H	"		A v.D		AG 6&!A#FGH 		A	JJt		A	
0AaC
89  "F		A
LL		A	
4!
<=#  	"2V;<!!	"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|bs42   N)tempfileNamedTemporaryFiler+   r   dictr   cProfilerunctxpstatsStats
sort_statsprint_stats)r   r/   
filehandlefilenamer)   varsstatss          r2   profiler      sp    ,,.JHDCd62DOO5dHMLL"E	\"	or*r=   __main__)T)   )ru   )i  )順 )r   r   )!r_   __license__r   ior   html.parserr   r   r   r   bs4.builderr   r    r   rl   r   r   r&   r   r3   r<   r?   rc   rk   rj   rq   r{   r   r   r   r\   stdinr   r`   r=   r2   <module>r      s    C    " 
 * ( 	      
 END $ z $ L	 %	M6$>@+ zSYY^^ r=   