509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
#6]„  ã               @   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j ƒ ƒ dS ))z=Diagnostic functions, mainly for use when doing tech support.ZMITé    N)ÚStringIO)Ú
HTMLParser)ÚBeautifulSoupÚ__version__)Úbuilder_registryc          ;   C   sX  t dt ƒ t dtj ƒ dddg}x>|D ]6}x0tjD ]}||jkr6P q6W |j|ƒ t d| ƒ q*W d|krÌ|jdƒ y*dd	l	m
} t d
djtt|jƒƒ ƒ W n* tk
rÊ } zt dƒ W Y dd}~X nX d|k�ryddl}t d|j ƒ W n, tk
�r } zt dƒ W Y dd}~X nX t| dƒ�r4| jƒ } nˆ| jdƒ�sL| jdƒ�rdt d|  ƒ t dƒ dS y:tjj| ƒ�rœt d|  ƒ t| ƒ�}|jƒ } W dQ R X W n tk
�r´   Y nX t ƒ  x–|D ]Ž}t d| ƒ d}	yt| |d�}
d}	W n8 tk
�r" } zt d| ƒ tjƒ  W Y dd}~X nX |	�rBt d| ƒ t |
jƒ ƒ t dd ƒ �qÂW dS )z/Diagnostic suite for isolating common problems.z'Diagnostic running on Beautiful Soup %szPython version %sz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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)ÚfeaturesTz%s could not parse the markup.z#Here's what %s did with the markup:ú-éP   )Úprintr   ÚsysÚversionr   Zbuildersr   ÚremoveÚappendr   r	   ÚjoinÚmapÚstrZLXML_VERSIONÚImportErrorr   Úhasattrr   Ú
startswithÚosÚpathÚexistsÚopenÚ
ValueErrorr   Ú	ExceptionÚ	tracebackÚ	print_excZprettify)ÚdataZbasic_parsersÚnameZbuilderr	   Úer   ÚfpÚparserÚsuccessÚsoup© r)   ú/usr/lib/python3.6/diagnose.pyÚdiagnose   sj    








r+   Tc             K   sN   ddl m} x<|jt| ƒfd|i|—ŽD ]\}}td||j|jf ƒ q(W dS )z—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.
    r   )r	   Úhtmlz%s, %4s, %sN)r   r	   Z	iterparser   r   ÚtagÚtext)r"   r,   Úkwargsr	   ZeventÚelementr)   r)   r*   Ú
lxml_traceZ   s    $r1   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 )ÚAnnouncingParserz?Announces HTMLParser parse events, without doing anything else.c             C   s   t |ƒ d S )N)r   )ÚselfÚsr)   r)   r*   Ú_pg   s    zAnnouncingParser._pc             C   s   | j d| ƒ d S )Nz%s START)r5   )r3   r#   Zattrsr)   r)   r*   Úhandle_starttagj   s    z AnnouncingParser.handle_starttagc             C   s   | j d| ƒ d S )Nz%s END)r5   )r3   r#   r)   r)   r*   Úhandle_endtagm   s    zAnnouncingParser.handle_endtagc             C   s   | j d| ƒ d S )Nz%s DATA)r5   )r3   r"   r)   r)   r*   Úhandle_datap   s    zAnnouncingParser.handle_datac             C   s   | j d| ƒ d S )Nz
%s CHARREF)r5   )r3   r#   r)   r)   r*   Úhandle_charrefs   s    zAnnouncingParser.handle_charrefc             C   s   | j d| ƒ d S )Nz%s ENTITYREF)r5   )r3   r#   r)   r)   r*   Úhandle_entityrefv   s    z!AnnouncingParser.handle_entityrefc             C   s   | j d| ƒ d S )Nz
%s COMMENT)r5   )r3   r"   r)   r)   r*   Úhandle_commenty   s    zAnnouncingParser.handle_commentc             C   s   | j d| ƒ d S )Nz%s DECL)r5   )r3   r"   r)   r)   r*   Úhandle_decl|   s    zAnnouncingParser.handle_declc             C   s   | j d| ƒ d S )Nz%s UNKNOWN-DECL)r5   )r3   r"   r)   r)   r*   Úunknown_decl   s    zAnnouncingParser.unknown_declc             C   s   | j d| ƒ d S )Nz%s PI)r5   )r3   r"   r)   r)   r*   Ú	handle_pi‚   s    zAnnouncingParser.handle_piN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r)   r)   r)   r*   r2   d   s   r2   c             C   s   t ƒ }|j| ƒ 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.
    N)r2   Zfeed)r"   r&   r)   r)   r*   Úhtmlparser_trace…   s    rC   ZaeiouZbcdfghjklmnpqrstvwxyzé   c             C   s>   d}x4t | ƒD ](}|d dkr$t}nt}|tj|ƒ7 }qW |S )z#Generate a random word-like string.Ú é   r   )ÚrangeÚ_consonantsÚ_vowelsÚrandomÚchoice)Úlengthr4   ÚiÚtr)   r)   r*   Úrword‘   s    rO   é   c             C   s   dj dd„ t| ƒD ƒƒS )z'Generate a random sentence-like string.ú c             s   s   | ]}t tjd dƒƒV  qdS )rP   é	   N)rO   rJ   Úrandint)Ú.0rM   r)   r)   r*   ú	<genexpr>ž   s    zrsentence.<locals>.<genexpr>)r   rG   )rL   r)   r)   r*   Ú	rsentenceœ   s    rV   éè  c             C   s¨   dddddddg}g }x~t | ƒD ]r}tjdd	ƒ}|dkrRtj|ƒ}|jd
| ƒ q |dkrr|jttjddƒƒƒ q |dkr tj|ƒ}|jd| ƒ q W ddj|ƒ d S )z+Randomly generate an invalid HTML document.ÚpZdivÚspanrM   ÚbZscriptÚtabler   é   z<%s>é   rP   rF   z</%s>z<html>Ú
z</html>)rG   rJ   rS   rK   r   rV   r   )Únum_elementsZ	tag_namesÚelementsrM   rK   Ztag_namer)   r)   r*   Úrdoc    s    

ra   é † c       
      C   s(  t dt ƒ t| ƒ}t dt|ƒ ƒ xŽdddgddgD ]z}d}y"tjƒ }t||ƒ}tjƒ }d}W n6 tk
r– } zt d	| ƒ tjƒ  W Y d
d
}~X nX |r6t d||| f ƒ q6W ddl	m
} tjƒ }|j|ƒ tjƒ }t d||  ƒ dd
l}	|	jƒ }tjƒ }|j|ƒ tjƒ }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   zhtml.parserFTz%s could not parse the markup.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   ra   ÚlenÚtimer   r   r    r!   r   r	   ZHTMLr   r   Úparse)
r_   r"   r&   r'   Úar(   rZ   r$   r	   r   r)   r)   r*   Úbenchmark_parsers²   s4    


rg   r   c             C   sX   t jƒ }|j}t| ƒ}tt||d�}tjd|||ƒ tj	|ƒ}|j
dƒ |jddƒ d S )N)Úbs4r"   r&   zbs4.BeautifulSoup(data, parser)Z
cumulativez_html5lib|bs4é2   )ÚtempfileZNamedTemporaryFiler#   ra   Údictrh   ÚcProfileZrunctxÚpstatsZStatsZ
sort_statsZprint_stats)r_   r&   Z
filehandleÚfilenamer"   ÚvarsZstatsr)   r)   r*   ÚprofileÒ   s    

rp   Ú__main__)T)rD   )rP   )rW   )rb   )rb   r   )!rB   Z__license__rl   Úior   Zhtml.parserr   rh   r   r   Zbs4.builderr   r   rm   rJ   rj   rd   r    r   r+   r1   r2   rC   rI   rH   rO   rV   ra   rg   rp   r?   Ústdinr   r)   r)   r)   r*   Ú<module>   s8   C

!	



 

