
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
6]3                 @   s  d Z dgZddlmZ yddlmZ W n2 ek
rX Z zG dd deZW Y ddZ[X nX ddlZddl	Z	ej
dd \ZZZedkoed	koedkZedkoedkZedkoed
kZddlmZmZmZmZmZ ddlmZmZ ddlmZmZmZ dZG dd deZG dd deZ edkred	kre rddl!Z!e!j"dZ#e#e _#e!j"de!j$Z%e%e_%ddlm&Z&m'Z' dd Z(dd Z)e(e_(e)e_)dZdS )zCUse the HTMLParser library to parse HTML files that aren't too bad.HTMLParserTreeBuilder    )
HTMLParser)HTMLParseErrorc               @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   !/usr/lib/python3.6/_htmlparser.pyr      s   r   N         )CDataCommentDeclarationDoctypeProcessingInstruction)EntitySubstitutionUnicodeDammit)HTMLHTMLTreeBuilderSTRICTzhtml.parserc               @   sp   e Zd Zdd Zdd Zdd Zddd	Zd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 )BeautifulSoupHTMLParserc             O   s   t j| f|| g | _d S )N)r   __init__already_closed_empty_element)selfargskwargsr   r   r	   r   9   s    	z BeautifulSoupHTMLParser.__init__c             C   s   t j| dS )ai  In Python 3, HTMLParser subclasses must implement error(), although this
        requirement doesn't appear to be documented.

        In Python 2, HTMLParser implements error() as raising an exception.

        In any event, this method is called only on very strange markup and our best strategy
        is to pretend it didn't happen and keep going.
        N)warningswarn)r   msgr   r   r	   errorE   s    	zBeautifulSoupHTMLParser.errorc             C   s   | j ||dd}| j| d S )NF)handle_empty_element)handle_starttaghandle_endtag)r   nameattrstagr   r   r	   handle_startendtagP   s    z*BeautifulSoupHTMLParser.handle_startendtagTc       	      C   sl   i }x(|D ] \}}|d krd}|||< d}q
W | j j|d d |}|rh|jrh|rh| j|dd | jj| d S )N z""F)check_already_closed)soupr"   Zis_empty_elementr#   r   append)	r   r$   r%   r!   Z	attr_dictkeyvalue	attrvaluer&   r   r   r	   r"   [   s    
z'BeautifulSoupHTMLParser.handle_starttagc             C   s,   |r|| j kr| j j| n| jj| d S )N)r   remover*   r#   )r   r$   r)   r   r   r	   r#   w   s    z%BeautifulSoupHTMLParser.handle_endtagc             C   s   | j j| d S )N)r*   handle_data)r   datar   r   r	   r0      s    z#BeautifulSoupHTMLParser.handle_datac             C   s   |j drt|jdd}n$|j dr8t|jdd}nt|}d }|dk rxR| jjdfD ]B}|sdqZyt|gj|}W qZ tk
r } zW Y d d }~X qZX qZW |syt|}W n& t	t
fk
r } zW Y d d }~X nX |pd}| j| d S )Nx   X   zwindows-1252u   �)
startswithintlstripr*   original_encoding	bytearraydecodeUnicodeDecodeErrorchr
ValueErrorOverflowErrorr0   )r   r$   Z	real_namer1   encodinger   r   r	   handle_charref   s*    

z&BeautifulSoupHTMLParser.handle_charrefc             C   s0   t jj|}|d k	r|}nd| }| j| d S )Nz&%s)r   ZHTML_ENTITY_TO_CHARACTERgetr0   )r   r$   	characterr1   r   r   r	   handle_entityref   s
    z(BeautifulSoupHTMLParser.handle_entityrefc             C   s&   | j j  | j j| | j jt d S )N)r*   endDatar0   r   )r   r1   r   r   r	   handle_comment   s    
z&BeautifulSoupHTMLParser.handle_commentc             C   sN   | j j  |jdr&|tdd  }n|dkr2d}| j j| | j jt d S )NzDOCTYPE ZDOCTYPEr(   )r*   rF   r6   lenr0   r   )r   r1   r   r   r	   handle_decl   s    

z#BeautifulSoupHTMLParser.handle_declc             C   sN   |j  jdr$t}|tdd  }nt}| jj  | jj| | jj| d S )NzCDATA[)upperr6   r   rH   r   r*   rF   r0   )r   r1   clsr   r   r	   unknown_decl   s    
z$BeautifulSoupHTMLParser.unknown_declc             C   s&   | j j  | j j| | j jt d S )N)r*   rF   r0   r   )r   r1   r   r   r	   	handle_pi   s    
z!BeautifulSoupHTMLParser.handle_piN)T)T)r   r   r   r   r    r'   r"   r#   r0   rB   rE   rG   rI   rL   rM   r   r   r   r	   r   7   s   

!

r   c               @   s<   e Zd ZdZdZeZeeegZ	dd Z
d
ddZdd	 ZdS )r   FTc             O   s,   t rt rd|d< trd|d< ||f| _d S )NFstrictZconvert_charrefs)CONSTRUCTOR_TAKES_STRICT CONSTRUCTOR_STRICT_IS_DEPRECATED"CONSTRUCTOR_TAKES_CONVERT_CHARREFSparser_args)r   r   r   r   r   r	   r      s
    
zHTMLParserTreeBuilder.__init__Nc             c   sN   t |tr|dddfV  dS ||g}t||d|d}|j|j|j|jfV  dS )z
        :return: A 4-tuple (markup, original encoding, encoding
        declared within markup, whether any characters had to be
        replaced with REPLACEMENT CHARACTER).
        NFT)Zis_htmlexclude_encodings)
isinstancestrr   markupr9   Zdeclared_html_encodingZcontains_replacement_characters)r   rV   Zuser_specified_encodingZdocument_declared_encodingrS   Ztry_encodingsZdammitr   r   r	   prepare_markup   s    
z$HTMLParserTreeBuilder.prepare_markupc             C   sr   | j \}}t||}| j|_y|j| |j  W n4 tk
rf } ztjtd |W Y d d }~X nX g |_	d S )Na*  Python's built-in HTMLParser cannot parse the given document. This is not a bug in Beautiful Soup. The best solution is to install an external parser (lxml or html5lib), and use Beautiful Soup with that parser. See http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser for help.)
rR   r   r*   feedcloser   r   r   RuntimeWarningr   )r   rV   r   r   parserrA   r   r   r	   rX      s    


zHTMLParserTreeBuilder.feed)NNN)r   r   r   Zis_xmlZ	picklable
HTMLPARSERNAMEr   r   Zfeaturesr   rW   rX   r   r   r   r	   r      s   
 
zQ\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?a  
  <[a-zA-Z][-.a-zA-Z0-9:_]*          # tag name
  (?:\s+                             # whitespace before attribute name
    (?:[a-zA-Z_][-.:a-zA-Z0-9_]*     # attribute name
      (?:\s*=\s*                     # value indicator
        (?:'[^']*'                   # LITA-enclosed value
          |\"[^\"]*\"                # LIT-enclosed value
          |[^'\">\s]+                # bare value
         )
       )?
     )
   )*
  \s*                                # trailing whitespace
)tagfindattrfindc             C   s8  d | _ | j|}|dk r|S | j}||| | _ g }tj||d }|sPtd|j }||d | j  | _}x||k rP| j	rt
j||}ntj||}|sP |jddd\}	}
}|
sd }nb|d d d  ko|dd  kn  s|d d d  ko|dd  kn  r$|dd }|r4| j|}|j|	j |f |j }qtW ||| j }|dkr| j \}}d
| j kr|| j jd
 }t| j | j jd
 }n|t| j  }| j	r| jd||| d d f  | j|||  |S |jd	r| j|| n"| j|| || jkr4| j| |S )Nr      z#unexpected call to parse_starttag()r   r
   '">/>
z junk characters in start tag: %r   rg   rg   )rc   rd   )Z__starttag_textZcheck_for_whole_start_tagrawdatar^   matchAssertionErrorendlowerZlasttagrN   r_   attrfind_tolerantgroupZunescaper+   stripZgetposcountrH   rfindr    r0   endswithr'   r"   ZCDATA_CONTENT_ELEMENTSset_cdata_mode)r   iendposrh   r%   ri   kr&   mZattrnamerestr.   rk   linenooffsetr   r   r	   parse_starttag  s\    
*,


r{   c             C   s$   |j  | _tjd| j tj| _d S )Nz</\s*%s\s*>)rl   Z
cdata_elemrecompileIZinteresting)r   elemr   r   r	   rs   T  s    
rs   T)*__doc____all__Zhtml.parserr   r   ImportErrorrA   	Exceptionsysr   version_infomajorminorreleaserO   rP   rQ   Zbs4.elementr   r   r   r   r   Z
bs4.dammitr   r   Zbs4.builderr   r   r   r\   r   r   r|   r}   rm   VERBOSEZlocatestarttagendr^   r_   r{   rs   r   r   r   r	   <module>   sB   "	 2
7