
    3 d"                     @   d Z ddlmZmZmZmZmZmZmZ ddl	m
Z
mZmZmZ ddlmZmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ  edd          Z eee!eee"e"f                  f                  Z# G d de          Z$dedee"         de"fdZ%dede"de"fdZ&dedee"         dee"         dee'         dee"         defdZ(dede#de)dee!         deee"e"f                  f
dZ*d efd!Z+d ed"e"d#e"fd$Z,dee!         dedeee"e"f                  fd%Z-d&S )'z
This module implements the FormRequest class which is a more convenient class
(than Request) to generate Requests based on form data.

See documentation in docs/topics/request-response.rst
    )IterableListOptionalTupleTypeTypeVarUnion)	urlencodeurljoinurlsplit
urlunsplit)FormElementHtmlElement
HTMLParserSelectElement)create_root_node)strip_html5_whitespace)Request)TextResponseis_listliketo_bytes)get_base_urlFormRequestTypeVarFormRequest)boundc                        e Zd ZddgZdddeddf fdZe	 	 	 	 	 	 	 	 dd
ee         de	de
e         de
e         de
e         dede
e         dede
e         de
e         defd            Z xZS )r   GETPOSTN)formdatar    returnc                   |r|                     d          d|d<    t                      j        |i | |rt          |t                    r|                                n|}t          || j                  }| j        dk    r2| j	        
                    dd           |                     |           d S |                     t          t          | j                                      |                               d S d S )Nmethodr   s   Content-Types!   application/x-www-form-urlencoded)query)getsuper__init__
isinstancedictitems
_urlencodeencodingr#   headers
setdefault	_set_body_set_urlr   r   url_replace)selfr    argskwargsr*   form_query_str	__class__s         8lib/python3.11/site-packages/scrapy/http/request/form.pyr'   zFormRequest.__init__   s    	&

8,, 	&%F8$)&))) 	(28T(B(BPHNN$$$E't}==N{f$ ''#%I   ~.....x11:::PPQQ    	 	    r   Fclsresponseformnameformid
formnumber	clickdata
dont_click	formxpathformcssc
                    |
                     d|j                   |	#ddlm}  |                                |	          }t          |||||          }t          ||||          }t          ||
                    dd                     }|
                    d|j	                  }||
                                }|| j        vrd} | d|||d|
S )	Nr,   r   )HTMLTranslatorr1   r#   r   )r1   r#   r     )r.   r,   parsel.csstranslatorrD   css_to_xpath	_get_form_get_inputs_get_form_urlpopr#   uppervalid_form_methods)r:   r;   r<   r=   r>   r    r?   r@   rA   rB   r5   rD   formr1   r#   s                  r8   from_responsezFormRequest.from_response/   s     	*h&7888 	?;;;;;;&((55g>>I8VZKKtXz9EED&**UD"9"9::Hdk22 	\\^^FS33 sGs6HGGGGGr9   )NNr   NNFNN)__name__
__module____qualname__rM   FormdataTyper'   classmethodr   r   r   r   strintr)   boolrO   __classcell__)r7   s   @r8   r   r      s=       7;    $      &  #' $$%!%$( #'!%H H$%HH 3-H 	H
 SMH H D>H H C=H #H 
H H H [H H H H Hr9   rN   r1   r!   c                     |@|                      d          }|| j        S t          | j        t          |                    S t          | j        |          S )Naction)r%   base_urlr   r   )rN   r1   rZ   s      r8   rJ   rJ   Q   sY    
 F(## 	!= t}&<V&D&DEEE4=#&&&r9   seqencc                 B    fd| D             }t          |d          S )Nc                     g | ]<\  }}t          |          r|n|gD ]"}t          |          t          |          f#=S rE   r   ).0kvsvr]   s       r8   
<listcomp>z_urlencode.<locals>.<listcomp>[   sn       Ar#B1""bT   
!S		8As++,   r9   T)doseq)r
   )r\   r]   valuess    ` r8   r+   r+   Z   s@         F
 V4((((r9   r;   r<   r=   r>   rA   c                 P   t          | j        t          t          |                     }|                    d          }|st          d|            |#|                    d| d          }|r|d         S |#|                    d| d          }|r|d         S |W|                    |          }|r.|d         }		 |	j        d
k    r|	S |	                                }	|	n%t          d|           |.	 ||         }
|
S # t          $ r t          d| d|            w xY wdS )z7Find the wanted form element within the given response.)r[   z//formzNo <form> element found in Nz//form[@name=""]r   z//form[@id="TrN   zNo <form> element found with zForm number z not found in )	r   textr   r   xpath
ValueErrortag	getparent
IndexError)r;   r<   r=   r>   rA   rootformsfnodeselrN   s              r8   rH   rH   c   s    HM:X@V@VWWWDJJx  E CAxAABBB JJ444455 	Q4K JJ0f00011 	Q4K  
F

9%% 	qB6V# I\\^^  DDDEEE  	$D K  	R 	R 	RPJPPhPPQQQ	R s   9D  D#r    r@   r?   c                 
   	 t          |pd                                          n$# t          t          f$ r t          d          w xY w|sg }|                     dddi          }fdd |D             D             }|s9t          ||           }|r'|d	         |vr|d	         |                    |           t          |t                     r|                                }|	                    d |D                        |S )zHReturn a list of key-value pairs for the inputs found in the given form.rE   z/formdata should be a dict or iterable of tupleszdescendant::textarea|descendant::select|descendant::input[not(@type) or @type[ not(re:test(., "^(?:submit|image|reset)$", "i")) and (../@checked or  not(re:test(., "^(?:checkbox|radio)$", "i")))]]re$http://exslt.org/regular-expressions
namespacesc                 2    g | ]\  }}||v||dn|fS )N rE   )r`   ra   rc   formdata_keyss      r8   rd   z_get_inputs.<locals>.<listcomp>   sP       Aq -'	
!"BB#  r9   c              3   4   K   | ]}t          |          V  d S N)_value)r`   es     r8   	<genexpr>z_get_inputs.<locals>.<genexpr>   s(      //1VAYY//////r9   r   Nc              3   (   K   | ]\  }}|||fV  d S r}   rE   r`   ra   rc   s      r8   r   z_get_inputs.<locals>.<genexpr>   s/      ??TQ?1a&??????r9   )
r)   keysrk   	TypeErrorrj   _get_clickableappendr(   r*   extend)rN   r    r@   r?   inputsrf   	clickabler{   s          @r8   rI   rI      s]   LX^,,1133	" L L LJKKKL  ZZ	< @A   F   /////  F  %"9d33	 	%1X5 	%il 	%MM)$$$(D!! $>>##
MM??X??????Ms	   #' !Aelec                 ^    | j         }| j        }| j        dk    rt          | ||          S ||fS )Nselect)namevaluerl   _select_value)r   nrc   s      r8   r~   r~      s:    A	A
w( (S!Q'''a4Kr9   r   rc   c                     | j         }||s| j        }|r
||d         fndS |'|r%|                     d          }d |D             }||fS ||fS )Nr   )NNz.//option[@selected]c                 n    g | ]2}|                     d           p|j        pd                                3S )r   rz   )r%   ri   strip)r`   os     r8   rd   z!_select_value.<locals>.<listcomp>   s:    UUUq155>>1QV1r88::UUUr9   )multiplevalue_optionsrj   )r   r   rc   r   r   selected_optionsrf   s          r8   r   r      s    |H 0 0 /1Q4yy</   99%;<<UUDTUUU&ya4Kr9   c                 <   t          |                    dddi                    }|sdS | 4|d         }|                    d          |                    d          pd	fS |                     d
d          }|W	 t          |j                  |         }|                    d          |                    d          pd	fS # t          $ r Y nw xY wdd	                    d |                                 D                       z   }|                    |          }t          |          dk    r8|d                             d          |d                             d          pd	fS t          |          dk    rt          d|d|           t          d|           )z
    Returns the clickable element specified in clickdata,
    if the latter is given. If not, it returns the first
    clickable element found
    z|descendant::input[re:test(@type, "^(submit|image)$", "i")]|descendant::button[not(@type) or re:test(@type, "^submit$", "i")]ru   rv   rw   Nr   r   r   rz   nrz.//*c              3   .   K   | ]\  }}d | d| dV  dS )z[@z="rh   NrE   r   s      r8   r   z!_get_clickable.<locals>.<genexpr>   s4      KKA_!__q___KKKKKKr9      zMultiple elements found (z&) matching the criteria in clickdata: z)No clickable element matching clickdata: )	listrj   r%   r   rn   joinr*   lenrk   )r?   rN   
clickablesrs   r   rj   s         r8   r   r      s    

QDE 	 	
 	
 J  t  7]vw 5266
 
tT	"	"B	 ;	;dk""2&B FF6NNBFF7OO$9r::  	 	 	D	 RWWKK9J9JKKKKKKE	E		B
2ww!| =1		&!!2a599W#5#5#;<<
2ww{ T4 4 4&/4 4
 
 	

 RYRRSSSs   :C   
CCN).__doc__typingr   r   r   r   r   r   r	   urllib.parser
   r   r   r   	lxml.htmlr   r   r   r   parsel.selectorr   
w3lib.htmlr   scrapy.http.requestr   scrapy.http.response.textr   scrapy.utils.pythonr   r   scrapy.utils.responser   r   r)   rU   rS   r   rJ   r+   rV   rH   rW   rI   r~   r   r   rE   r9   r8   <module>r      s    I H H H H H H H H H H H H H H H H H A A A A A A A A A A A A I I I I I I I I I I I I , , , , , , - - - - - - ' ' ' ' ' ' 2 2 2 2 2 2 5 5 5 5 5 5 5 5 . . . . . .W1GGG dDsCx$99:;5H 5H 5H 5H 5H' 5H 5H 5Hp' '(3- 'C ' ' ' ')H )3 )3 ) ) ) )++sm+ SM+ 	+
 }+ + + + +\&
&& & ~	&
 
%S/& & & &R    }       /T~/T%0/TeCHo/T /T /T /T /T /Tr9   