
    !h,                    F   S r SSKJr  SSKrSSKJr  SSKJrJrJ	r	J
r
  SSKJr  SSKrSSKJrJrJrJrJr  SSKJr  SS	KJr  SS
KJrJr  SSKJr  \(       a(  SSKJrJrJ r   SSK!J"r"  SSK#J$r$J%r%J&r&  SSK'J(r(  SSK)J*r*J+r+  \," 5       r- " S S\5      r. " S S\/5      r0SS jr1g)z
This module implements the TextResponse class which adds encoding handling and
discovering (through HTTP headers) to base Response class.

See documentation in docs/topics/request-response.rst
    )annotationsN)suppress)TYPE_CHECKINGAnyAnyStrcast)urljoin)html_body_declared_encodinghtml_to_unicodehttp_content_type_encodingread_bomresolve_encoding)strip_html5_whitespace)Response)memoizemethod_noargs
to_unicode)get_base_url)CallableIterableMapping)Failure)	CallbackTCookiesTRequest)Link)SelectorSelectorListc                    ^  \ rS rSr% Sr\r/ \R                  QSP7rS\	S'   SU 4S jjr
SU 4S jjr\SS j5       rSS	 jrSS
 jr\SS j5       rSS jr\SS j5       rSS jrSS jr\SS j5       r\SS j5       r\S S j5       rS!S jrS!S jrS"S jr            S#                           S$U 4S jjjr               S%                               S&U 4S jjjrSrU =r$ )'TextResponse*   asciiencodingztuple[str, ...]
attributesc                ~   > UR                  SS 5      U l        S U l        S U l        S U l        [
        TU ]  " U0 UD6  g )Nr"   )pop	_encoding_cached_benc_cached_ubody_cached_selectorsuper__init__)selfargskwargs	__class__s      `/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/scrapy/http/response/text.pyr+   TextResponse.__init__0   s?    %+ZZ
D%A(,)-15$)&)    c                   > SU l         [        U[        5      (       aP  U R                  c"  [	        S[        U 5      R                   S35      eUR                  U R                  5      U l         g [        TU ]%  U5        g )Nr2   zCannot convert unicode body - z has no encoding)
_body
isinstancestrr&   	TypeErrortype__name__encoder*   	_set_body)r,   bodyr/   s     r0   r;   TextResponse._set_body7   sl    
dC  ~~%4Dz**++;=  T^^4DJGd#r2   c                P    U R                  5       =(       d    U R                  5       $ N)_declared_encoding_body_inferred_encodingr,   s    r0   r"   TextResponse.encodingC   s    &&(JD,H,H,JJr2   c                    U R                   =(       d>    U R                  5       =(       d'    U R                  5       =(       d    U R                  5       $ r?   )r&   _bom_encoding_headers_encoding_body_declared_encodingrB   s    r0   r@   TextResponse._declared_encodingG   sC    NN .!!#.%%'. ++-		
r2   c                    U R                   [        L a%  [        R                  " U R                  5      U l         U R                   $ )zH
.. versionadded:: 2.2

Deserialize a JSON document to a Python object.
)_cached_decoded_json_NONEjsonloadsr<   rB   s    r0   rL   TextResponse.jsonO   s3     $$-(,

499(=D%(((r2   c                    U R                   nU R                  c"  SU 3n[        X R                  5      S   U l        U R                  $ )zBody as unicodezcharset=   )r"   r(   r   r<   )r,   benccharsets      r0   textTextResponse.textY   sG    
 }}% 'G!0))!DQ!GD!!!r2   c                ,    [        [        U 5      U5      $ )zgJoin this Response's url with a possible relative url to form an
absolute interpretation of the latter.)r	   r   )r,   urls     r0   r	   TextResponse.urljoind   s     |D)3//r2   c                |    [        [        U R                  R                  SS5      5      n[	        [        USS95      $ )N   Content-Typer2   latin-1r"   )r   bytesheadersgetr   r   )r,   content_types     r0   rF   TextResponse._headers_encodingi   s1    E4<<#3#3OS#IJ)*\I*VWWr2   c           	        U R                   cj  [        [        [        U R                  R                  SS5      5      SS9n[        UU R                  U R                  U R                  S9u  p#X l         X0l
        U R                   $ )NrY   r2   rZ   r[   )auto_detect_fundefault_encoding)r'   r   r   r\   r]   r^   r   r<   _auto_detect_fun_DEFAULT_ENCODINGr(   )r,   r_   rQ   ubodys       r0   rA   $TextResponse._body_inferred_encodingn   sy    $%UDLL,,_cBCiL *		 $ 5 5!%!7!7	KD !%!&   r2   c                    U R                   SS4 H   n UR                  U5        [        U5      s  $    g ! [         a     M2  f = f)Nzutf-8cp1252)re   decodeUnicodeErrorr   )r,   rS   encs      r0   rd   TextResponse._auto_detect_fun}   sP    **GX>CC  $C(( ?    s   5
AAc                ,    [        U R                  5      $ r?   )r
   r<   rB   s    r0   rG   $TextResponse._body_declared_encoding   s    *49955r2   c                2    [        U R                  5      S   $ )Nr   )r   r<   rB   s    r0   rE   TextResponse._bom_encoding   s    		"1%%r2   c                Z    SSK Jn  U R                  c  U" U 5      U l        U R                  $ )Nr   )r   )scrapy.selectorr   r)   )r,   r   s     r0   selectorTextResponse.selector   s)    ,  ($,TND!$$$r2   c                    SSK Jn  [        U R                  S5      (       d  [	        S5      e[        X0R                  R                  " U40 UD65      $ )Nr   r   jmespathz6Please install parsel >= 1.8.1 to get jmespath support)rs   r   hasattrrt   AttributeErrorr   rx   r,   queryr.   r   s       r0   rx   TextResponse.jmespath   sG    0t}}j11 H  L--"8"8"I&"IJJr2   c                Z    SSK Jn  [        X0R                  R                  " U40 UD65      $ Nr   rw   )rs   r   r   rt   xpathr{   s       r0   r   TextResponse.xpath   s$    0L--"5"5e"Fv"FGGr2   c                V    SSK Jn  [        X R                  R	                  U5      5      $ r   )rs   r   r   rt   css)r,   r|   r   s      r0   r   TextResponse.css   s    0L--"3"3E":;;r2   c                  > [        U[        R                  5      (       a  [        U5      nO*[        U[        R                  5      (       a  [        S5      eUc  U R                  OUn[        TU ]!  UUUUUUUUU	U
UUUS9$ )a^  
Return a :class:`~.Request` instance to follow a link ``url``.
It accepts the same arguments as ``Request.__init__()`` method,
but ``url`` can be not only an absolute URL, but also

* a relative URL
* a :class:`~scrapy.link.Link` object, e.g. the result of
  :ref:`topics-link-extractors`
* a :class:`~scrapy.Selector` object for a ``<link>`` or ``<a>`` element, e.g.
  ``response.css('a.my_link')[0]``
* an attribute :class:`~scrapy.Selector` (not SelectorList), e.g.
  ``response.css('a::attr(href)')[0]`` or
  ``response.xpath('//img/@src')[0]``

See :ref:`response-follow-example` for usage examples.
zSelectorList is not supported)rV   callbackmethodr]   r<   cookiesmetar"   prioritydont_filtererrback	cb_kwargsflags)	r5   parselr   _url_from_selectorr   
ValueErrorr"   r*   follow)r,   rV   r   r   r]   r<   r   r   r"   r   r   r   r   r   r/   s                 r0   r   TextResponse.follow   s    @ c6??++$S)CV0011<==$,$44==(w~#  
 	
r2   c                  > XU4 Vs/ s H
  nUc  M  UPM     nn[        U5      S:w  a  [        S5      eU(       d0  U(       a  U R                  U5      nU(       a  U R                  U5      n[	        U[
        R                  5      (       a?  Un/ nU H5  n[        [        5         UR                  [        U5      5        SSS5        M7     [        TU ]1  [        SU5      UUUUUUUU	U
UUUS9$ s  snf ! , (       d  f       Mp  = f)aK  
A generator that produces :class:`~.Request` instances to follow all
links in ``urls``. It accepts the same arguments as the :class:`~.Request`'s
``__init__()`` method, except that each ``urls`` element does not need to be
an absolute URL, it can be any of the following:

* a relative URL
* a :class:`~scrapy.link.Link` object, e.g. the result of
  :ref:`topics-link-extractors`
* a :class:`~scrapy.Selector` object for a ``<link>`` or ``<a>`` element, e.g.
  ``response.css('a.my_link')[0]``
* an attribute :class:`~scrapy.Selector` (not SelectorList), e.g.
  ``response.css('a::attr(href)')[0]`` or
  ``response.xpath('//img/@src')[0]``

In addition, ``css`` and ``xpath`` arguments are accepted to perform the link extraction
within the ``follow_all()`` method (only one of ``urls``, ``css`` and ``xpath`` is accepted).

Note that when passing a ``SelectorList`` as argument for the ``urls`` parameter or
using the ``css`` or ``xpath`` parameters, this method will not produce requests for
selectors from which links cannot be obtained (for instance, anchor tags without an
``href`` attribute)
NrP   zFPlease supply exactly one of the following arguments: urls, css, xpathzIterable[str | Link])urlsr   r   r]   r<   r   r   r"   r   r   r   r   r   )lenr   r   r   r5   r   r   r   _InvalidSelectorappendr   r*   
follow_allr   )r,   r   r   r   r]   r<   r   r   r"   r   r   r   r   r   r   r   x	arguments	selectorsselr/   s                       r0   r   TextResponse.follow_all   s   R "&E 2D 21aQ 2	Dy>QX  xx}zz%(dF//00ID ./KK 23 78 0/ ! w!,d3# " 
 	
! E 0/s   C-C-#C22
D	)r4   r'   rJ   r)   r(   r&   )r-   r   r.   r   )r<   zstr | bytes | NonereturnNone)r   r6   )r   
str | None)r   r   )rV   r6   r   r6   )rS   r\   r   r   )r   r   )r|   r6   r.   r   r   r   )r|   r6   r   r   )NGETNNNNNr   FNNN)rV   zstr | Link | parsel.Selectorr   CallbackT | Noner   r6   r]   :Mapping[AnyStr, Any] | Iterable[tuple[AnyStr, Any]] | Noner<   bytes | str | Noner   CookiesT | Noner   dict[str, Any] | Noner"   r   r   intr   boolr   Callable[[Failure], Any] | Noner   r   r   list[str] | Noner   r   )NNr   NNNNNr   FNNNNN) r   z1Iterable[str | Link] | parsel.SelectorList | Noner   r   r   r6   r]   r   r<   r   r   r   r   r   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   zIterable[Request]) r9   
__module____qualname____firstlineno__re   rK   rJ   r   r#   __annotations__r+   r;   propertyr"   r@   rL   rS   r	   r   rF   rA   rd   rG   rE   rt   rx   r   r   r   r   __static_attributes____classcell__)r/   s   @r0   r   r   *   s    "DH$7$7"D"DJD*
$ K K
) " "0
 X X! 6 6 & & % %KH
< &*NR#'#'&*#!37+/"&3
)3
 #3
 	3

 L3
 !3
 !3
 $3
 3
 3
 3
 13
 )3
  3
 
3
 3
n CG%)NR#'#'&*#!37+/"& !G
?G
 #G
 	G

 LG
 !G
 !G
 $G
 G
 G
 G
 1G
 )G
  G
 G
  !G
" 
#G
 G
r2   r   c                      \ rS rSrSrSrg)r   i)  z6
Raised when a URL cannot be obtained from a Selector
 N)r9   r   r   r   __doc__r   r   r2   r0   r   r   )  s    r2   r   c                   [        U R                  [        5      (       a  [        U R                  5      $ [	        U R                  S5      (       d  [        SU  35      eU R                  R                  S;  a#  [        SU R                  R                   S35      eU R                  R                  S5      nUc%  [        SU R                  R                   SU  35      e[        U5      $ )	NtagzUnsupported selector: )alinkz1Only <a> and <link> elements are supported; got <>href<z!> element has no href attribute: )r5   rootr6   r   ry   r   r   r^   )r   r   s     r0   r   r   /  s    #((C  %chh//388U##!7u=>>
xx||=(?~QO
 	
 88<<D|388<<.0QRUQVWXX!$''r2   )r   zparsel.Selectorr   r6   )2r   
__future__r   rL   
contextlibr   typingr   r   r   r   urllib.parser	   r   w3lib.encodingr
   r   r   r   r   
w3lib.htmlr   scrapy.http.responser   scrapy.utils.pythonr   r   scrapy.utils.responser   collections.abcr   r   r   twisted.python.failurer   scrapy.http.requestr   r   r   scrapy.linkr   rs   r   r   objectrK   r   r   r   r   r   r2   r0   <module>r      sz    #   3 3     . ) @ .;;.@@ 6 	|
8 |
~z (r2   