£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
    A[                 @   s   d dl mZmZmZ d dlmZ d dlmZ d dlm	Z
mZ e
e_	ee_dgZG dd deZG dd deZG d	d
 d
eZdS )    )absolute_importdivisionunicode_literals)str)urllib)parserequestRobotFileParserc               @   sZ   e Zd Z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d ZdS )r	   zs This class provides a set of methods to read, parse and answer
    questions about a single robots.txt file.

     c             C   s,   g | _ d | _d| _d| _| | d| _d S )NFr   )entriesdefault_entrydisallow_all	allow_allset_urllast_checked)selfurl r   T/opt/alt/python37/lib/python3.7/site-packages/future/backports/urllib/robotparser.py__init__   s    
zRobotFileParser.__init__c             C   s   | j S )zReturns the time the robots.txt file was last fetched.

        This is useful for long-running web spiders that need to
        check for new robots.txt files periodically.

        )r   )r   r   r   r   mtime&   s    zRobotFileParser.mtimec             C   s   ddl }|  | _dS )zYSets the time the robots.txt file was last fetched to the
        current time.

        r   N)timer   )r   r   r   r   r   modified/   s    zRobotFileParser.modifiedc             C   s&   || _ tj|dd \| _| _dS )z,Sets the URL referring to a robots.txt file.      N)r   r   r   urlparsehostpath)r   r   r   r   r   r   7   s    zRobotFileParser.set_urlc          
   C   s|   yt j| j}W nH t jjk
rZ } z&|jdkr:d| _n|jdkrJd| _W dd}~X Y nX |	 }| 
|d  dS )z4Reads the robots.txt URL and feeds it to the parser.)i  i  Ti  Nzutf-8)r   r   Zurlopenr   errorZ	HTTPErrorcoder   r   readr   decode
splitlines)r   ferrrawr   r   r   r    <   s    

zRobotFileParser.readc             C   s,   d|j kr| jd kr(|| _n| j| d S )N*)
useragentsr   r   append)r   entryr   r   r   
_add_entryI   s    

zRobotFileParser._add_entryc             C   st  d}t  }xN|D ]D}|sL|dkr0t  }d}n|dkrL| | t  }d}|d}|dkrj|d| }| }|sxq|dd}t|dkr|d   |d< tj	|d  |d< |d dkr|dkr| | t  }|j
|d  d}q|d dkr*|dkrX|jt|d d	 d}q|d d
kr|dkr|jt|d d d}qW |dkrp| | dS )zParse the input lines from a robots.txt file.

        We allow that a user-agent: line is not preceded by
        one or more blank lines.
        r   r      #N:z
user-agentZdisallowFZallowT)Entryr*   findstripsplitlenlowerr   r   unquoter'   r(   	rulelinesRuleLine)r   linesstater)   lineir   r   r   r   R   sJ    





zRobotFileParser.parsec             C   s   | j r
dS | jrdS tjtj|}tjdd|j|j|j	|j
f}tj|}|s\d}x"| jD ]}||rd||S qdW | jr| j|S dS )z=using the parsed robots.txt decide if useragent can fetch urlFTr
   /)r   r   r   r   r   r4   Z
urlunparser   ZparamsZqueryZfragmentquoter   
applies_to	allowancer   )r   	useragentr   Z
parsed_urlr)   r   r   r   	can_fetch   s     
zRobotFileParser.can_fetchc             C   s   d dd | jD S )Nr
   c             S   s   g | ]}t |d  qS )
)r   ).0r)   r   r   r   
<listcomp>   s    z+RobotFileParser.__str__.<locals>.<listcomp>)joinr   )r   r   r   r   __str__   s    zRobotFileParser.__str__N)r
   )__name__
__module____qualname____doc__r   r   r   r   r    r*   r   r@   rE   r   r   r   r   r	      s   
		3c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r6   zoA rule line is a single "Allow:" (allowance==True) or "Disallow:"
       (allowance==False) followed by a path.c             C   s(   |dkr|sd}t j|| _|| _d S )Nr
   T)r   r   r<   r   r>   )r   r   r>   r   r   r   r      s    zRuleLine.__init__c             C   s   | j dkp|| j S )Nr&   )r   
startswith)r   filenamer   r   r   r=      s    zRuleLine.applies_toc             C   s   | j r
dpdd | j S )NZAllowZDisallowz: )r>   r   )r   r   r   r   rE      s    zRuleLine.__str__N)rF   rG   rH   rI   r   r=   rE   r   r   r   r   r6      s   r6   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )r.   z?An entry has one or more user-agents and zero or more rulelinesc             C   s   g | _ g | _d S )N)r'   r5   )r   r   r   r   r      s    zEntry.__init__c             C   sP   g }x| j D ]}|d|dg qW x | jD ]}|t|dg q,W d|S )NzUser-agent: rA   r
   )r'   extendr5   r   rD   )r   Zretagentr9   r   r   r   rE      s    zEntry.__str__c             C   sF   | dd  }x.| jD ]$}|dkr*dS | }||krdS qW dS )z2check if this entry applies to the specified agentr;   r   r&   TF)r1   r3   r'   )r   r?   rM   r   r   r   r=      s    zEntry.applies_toc             C   s$   x| j D ]}||r|jS qW dS )zZPreconditions:
        - our agent applies to this entry
        - filename is URL decodedT)r5   r=   r>   )r   rK   r9   r   r   r   r>      s    

zEntry.allowanceN)rF   rG   rH   rI   r   rE   r=   r>   r   r   r   r   r.      s
   r.   N)Z
__future__r   r   r   Zfuture.builtinsr   Zfuture.backportsr   Zfuture.backports.urllibr   _parser   Z_request__all__objectr	   r6   r.   r   r   r   r   <module>   s    	