
    ǁij                    4   d dl mZ d dlZd dlZd dlZd dlZd dlmZ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 d d	lmZmZ d d
lmZmZ d dlZd dlmZ d dlmZ d dlmZ ddlm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(  ejR                  d      Z* G d d      Z+y)    )annotationsN)datetimetimezone)cached_property)cycle)shuffle)sleeptime)TracebackType)AnyLiteral)parse_qsurlparse)_Element)
HTMLParser)document_fromstring   )DuckDuckGoSearchExceptionRatelimitExceptionTimeoutException)_expand_proxy_tb_alias_extract_vqd
_normalize_normalize_url
json_loadszduckduckgo_search.DDGSc                     e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZ	 	 	 d	 	 	 	 	 	 	 ddZedd       ZdddZ		 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ
dd	Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd
Z	 	 	 d	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d dZ	 	 	 	 	 	 	 d!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d"dZ	 	 	 	 d#	 	 	 	 	 	 	 	 	 	 	 d$dZy)%DDGSzBDuckDuckgo_search class to get search results from duckduckgo.com.Nc           
     p   t        j                  d       t        j                  dt        d       t        j
                  j                  d      }|r|n
t        |      | _        | j                  !t        | j                  t              sJ d       |sT|rRt        j                  dd	       t        |t              r$|j                  d
      xs |j                  d      n|| _        |r|ni | _        || _        t        j                  | j                  | j                  ddddd|      | _        d| _        y)a  Initialize the DDGS object.

        Args:
            headers (dict, optional): Dictionary of headers for the HTTP client. Defaults to None.
            proxy (str, optional): proxy for the HTTP client, supports http/https/socks5 protocols.
                example: "http://user:pass@example.com:3128". Defaults to None.
            timeout (int, optional): Timeout value for the HTTP client. Defaults to 10.
            verify (bool): SSL verification when making the request. Defaults to True.
        alwaysz^This package (`duckduckgo_search`) has been renamed to `ddgs`! Use `pip install ddgs` instead.   
stacklevel
DDGS_PROXYNzproxy must be a strz-'proxies' is deprecated, use 'proxy' instead.r   httphttpsTrandomF)proxytimeoutcookie_storerefererimpersonateimpersonate_osfollow_redirectsverify        )warningssimplefilterwarnRuntimeWarningosenvirongetr   r'   
isinstancestrdictheadersr(   primpClientclientsleep_timestamp)selfr:   r'   proxiesr(   r.   
ddgs_proxys          m/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/duckduckgo_search/duckduckgo_search.py__init__zDDGS.__init__$   s    " 	h'l	
 "$!=
/9?UV[?\
zz!Z

C%@WBWW@MMIVWXHRSZ\`HaV,DG0DgnDJ")wrll**LL #"
  #    c                    | S N r?   s    rB   	__enter__zDDGS.__enter__S   s    rD   c                     y rF   rG   )r?   exc_typeexc_valexc_tbs       rB   __exit__zDDGS.__exit__V   s     	rD   c                     t        dddd      S )zGet HTML parser.TF)remove_blank_textremove_comments
remove_piscollect_ids)LHTMLParserrH   s    rB   parserzDDGS.parser^   s     T4TXfkllrD   c                    | j                   sdnt               | j                   z
  dk\  rdn|}t               | _         t        |       y)zSleep between API requests.r/      N)r>   r
   r	   )r?   	sleeptimedelays      rB   _sleepzDDGS._sleepc   s:    //DFTEYEY<Y]_<_Sen#verD   c
                   | j                          	 | j                  j                  |||||||||	xs | j                  	      }
t        j                  d|
j                   d|
j                          |
j                  dk(  r|
S |
j                  dv r%t        |
j                   d|
j                   d      t        |
j                   d	|d
|d|      # t        $ rn}dt        |      j                         v r't        | dt        |      j                   d|       |t        | dt        |      j                   d|       |d }~ww xY w)N)paramscontentdatar:   cookiesjsonr(   r
    z: z_get_url()    )   i-  i  i  i  i  z
 Ratelimitz return None. params=z	 content=z data=)rZ   r=   requestr(   	Exceptionr8   lowerr   type__name__r   loggerdebugurlstatus_coder   )r?   methodrk   r\   r]   r^   r:   r_   r`   r(   respexs               rB   _get_urlzDDGS._get_urli   s_    		X;;&&/4<< ' 
D 	{488*Ad.>.>-?@As"K!??$z43C3C2DJ%OPP'488*4J6):WJV]X\W^(_``  	XR(&#aR0A0A/B"RD'IJPRR+se1T"X5F5F4Gr",NOUWW	Xs   2C 	E A)E		Ec                Z    | j                  ddd|i      j                  }t        ||      S )z!Get vqd value for a search query.GETzhttps://duckduckgo.comqr\   )rp   r]   r   )r?   keywordsresp_contents      rB   _get_vqdzDDGS._get_vqd   s/    }}U,DcS[_}]eeL(33rD   c                   |dv rt        j                  d|dd       d}|dk(  rddgn|g}t        |       d	g}g d
}	}|D ]S  }
	 |
dk(  r| j                  ||||      }n3|
dk(  r| j	                  ||||      }n|
d	k(  r| j                  ||||      }|c S  t        |	      # t        $ r'}t        j                  d|
 d|        |}	Y d
}~d
}~ww xY w)a  DuckDuckGo text search. Query params: https://duckduckgo.com/params.

        Args:
            keywords: keywords for query.
            region: us-en, uk-en, ru-ru, etc. Defaults to None.
            safesearch: on, moderate, off. Defaults to "moderate".
            timelimit: d, w, m, y. Defaults to None.
            backend: auto, html, lite. Defaults to auto.
                auto - try all backends in random order,
                html - collect data from https://html.duckduckgo.com,
                lite - collect data from https://lite.duckduckgo.com,
                bing - collect data from https://www.bing.com.
            max_results: max number of results. If None, returns results only from the first response. Defaults to None.

        Returns:
            List of dictionaries with search results, or None if there was an error.

        Raises:
            DuckDuckGoSearchException: Base exception for duckduckgo_search errors.
            RatelimitException: Inherits from DuckDuckGoSearchException, raised for exceeding API request rate limits.
            TimeoutException: Inherits from DuckDuckGoSearchException, raised for API request timeouts.
        )apiecosiazbackend=z$ is deprecated, using backend='auto'r    r!   autohtmllitebingNzError to search using z
 backend: )
r0   r2   r   
_text_html
_text_lite
_text_bingre   ri   infor   )r?   ru   region
safesearch	timelimitbackendmax_resultsbackendsresultserrbro   s               rB   textz	DDGS.text   s    > ''MMXWJ&JKXYZG'.&'8FF#wi84 	A
;"ooh	;WG&["ooh	;WG&["ooh	;WG	 (,,	  4QCz"FGs   AB##	C,CCc           	     Z   |sJ d       ddd}| j                   j                  |       |dd}|r||d<   |r||d<   t               }g }t        d	      D ]M  }	| j	                  d
d|      j
                  }
d|
v r|c S t        |
| j                        }|j                  d      }t        |t              s|c S |D ]*  }t        |t              s|j                  d      }|rt        |t              rt        |d         nd }|sK||vsP|j                  d      rb|j                  |       |j                  d      }|rt        |t              rt        |d         nd}|j                  d      }|r(t        |t              rdj                  d |D              nd}|j!                  t#        |      t%        |      t#        |      d       |st'        |      |k\  s'|c c S  |j                  d      }|r|s|c S t        |t              r|d   nd }t        |t              s|j                  d      }|j                  d      }t        |t              st        |t              st)        ||      D ci c]  \  }}t        |      t        |       }}}P |S c c}}w )Nkeywords is mandatoryzhttps://html.duckduckgo.com/?1RefererzSec-Fetch-User rs   r   kldf   POSTz https://html.duckduckgo.com/htmlr^   s   No  results.z	//div[h2]z	./a/@hrefr   zhttp://www.google.com/search?q=z%https://duckduckgo.com/y.js?ad_domainz./h2/a/text()z./a//text()c              3  2   K   | ]  }t        |        y wrF   r8   .0xs     rB   	<genexpr>z"DDGS._text_html.<locals>.<genexpr>        &A!s1v&A   titlehrefbodyz.//div[@class="nav-link"].//input[@type="hidden"]/@name.//input[@type="hidden"]/@value)r=   headers_updatesetrangerp   r]   r   rU   xpathr7   listr   r8   
startswithaddjoinappendr   r   lenzip)r?   ru   r   r   r   r:   payloadcacher   _rv   treeelementse	hrefxpathr   
titlexpathr   	bodyxpathr   npx	next_pagenamesvaluesnvs                             rB   r   zDDGS._text_html   s    000x 6"
 	""7+ 
 "GDM%GDM(*q ,	NA==1SZa=bjjL,.&|T[[ADzz+.Hh- +a* ! 4I09jTX>Y3y|,_cD - $h! 		$%&WW_%=
6@ZPZ\`EaJqM 2gi$%GGM$:	ENS]^gimSnrww&Ay&AAtv)3E):(6t(<(24(8 '3w<;+F#*N1+4 **89Ck#-c4#8BdI)X.!(HI")JKeT*z&$/G:=eV:LM$!Qs1vs1v~MGMY,	N\  Ns    J'c           	     &   |sJ d       ddd}| j                   j                  |       |dd}|r||d<   |r||d<   t               }g }t        d	      D ]  }	| j	                  d
d|      j
                  }
d|
v r|c S t        |
| j                        }|j                  d      }t        |t              s|c S t        t        t        dd	            |      }|D ]l  \  }}t        |t              s|dk(  r|j                  d      }|rt        |t              rt        |d         nd }|||v s|j                  d      r$t        d      D 	cg c]  }	t!        |d        c}	 |j#                  |       |j                  d      }|rt        |t              rt        |d         nd}|dk(  s|j                  d      }|r6t        |t              r&dj%                  d |D              j'                         nd}s%|j)                  t+              t-        |      t+        |      d       |sYt/        |      |k\  si|c c S  |j                  d      }|r|s|c S t        |t              r|d   nd }t        |t              s8|j                  d      }|j                  d      }t        |t              slt        |t              s~t        ||      D ci c]  \  }}t        |      t        |       }}} |S c c}	w c c}}w )Nr   zhttps://lite.duckduckgo.com/r   r   r   r   r   r   r   r   z!https://lite.duckduckgo.com/lite/r   s   No more results.z//table[last()]//trr   z.//a//@hrefr   r      z.//a//text()r    z&.//td[@class='result-snippet']//text()c              3  2   K   | ]  }t        |        y wrF   r   r   s     rB   r   z"DDGS._text_lite.<locals>.<genexpr>M  s     #>qCF#>r   r   z(//form[./input[contains(@value, 'ext')]]r   r   r   )r=   r   r   r   rp   r]   r   rU   r   r7   r   r   r   r   r8   r   nextr   r   stripr   r   r   r   )r?   ru   r   r   r   r:   r   r   r   r   rv   r   r   r^   ir   r   r   r   r   r   r   r   r   r   r   r   r   s                               rB   r   zDDGS._text_lite  s    000x 6"
 	""7+ 
 "GDM%GDM(*q 6	NA==1T[b=ckkL"l2&|T[[ADzz"78Hh-uU1a[)84D !/1a*Av$%GGM$:	4=*YX\B]s9Q<0cg L#u}# l  8=Qx@!T$-@!IIdO)*)@J:DT^`dIeC
1$6kmEa$%GG,T$U	  )Z	4-H GG#>I#>>DDF!# 
  #NN-7->,:4,@,6t,<!"  +s7|{/J'.C!/F **GHCk#-c4#8BdI)X.!(HI")JKeT*z&$/G:=eV:LM$!Qs1vs1v~MGMm6	Np C A> Ns   L!Lc           
     F   |sJ d       |r-d| d| d| d| d}| j                   j                  d|       d|i}|r;t        t               d	z        }|d
k(  rd|dz
   d| nddddd|   z   }d| d|d<   t	               }	g }
t        d      D ]  }| j                  dd|      j                  }d|v r|
c S t        || j                        }|j                  d      }t        |t              s|
c S |D ]~  }t        |t              s|j                  d      }|rt        |t              rt        |d         nd }|rJ|j                  d      r9 d t!        t#        |      j$                        j'                  d d!g      d         }|s||	vs|	j)                  |       |j                  d"      }|r(t        |t              rd!j+                  d# |D              nd!}|j                  d$      }|r(t        |t              rd!j+                  d% |D              nd!}|
j-                  t/        |      t1        |      t/        |      j3                  d&d'      d(       |skt5        |
      |k\  s{|
c c S  |s|
c S |d)z   d*z  d)z    |d+<   d,|dkD  r|nd! |d-<    |
S ).Nr   zu=z&m=zui=z&mkt=)_EDGE_CD_EDGE_Szhttps://www.bing.comrs   iQ yez5_im  r   ez123)dwmzex1:""filtersr   rr   zhttps://www.bing.com/searchrt   zThere are no results forz //li[contains(@class, 'b_algo')]z8./h2/a/@href | ./div[contains(@class, 'header')]/a/@hrefr   zhttps://www.bing.com/ck/a?c                    | rIt        |       dkD  r;t        j                  | dd  x}dt        |       dz  z  z         j                         S d S )Nr    =   )r   base64urlsafe_b64decodedecode)ur   s     rB   <lambda>z!DDGS._text_bing.<locals>.<lambda>  sV     SVaZ '-&>&>QqrU
cWZ[\W]V]abUbNc?c&d&k&k&m !% rD   r   r   z?./h2/a//text() | ./div[contains(@class, 'header')]/a/h2//text()c              3  2   K   | ]  }t        |        y wrF   r   r   s     rB   r   z"DDGS._text_bing.<locals>.<genexpr>  s     #?qCF#?r   z.//p//text()c              3  2   K   | ]  }t        |        y wrF   r   r   s     rB   r   z"DDGS._text_bing.<locals>.<genexpr>  r   r       ra   r   r   
   firstPEREFORM)r=   set_cookiesintr
   r   r   rp   r   r   rU   r   r7   r   r   r8   r   r   r   queryr6   r   r   r   r   r   replacer   )r?   ru   r   r   r   r_   r   r   coder   r   pagerv   r   r   r   r   r   r   r   r   r   s                         rB   r   zDDGS._text_bingh  s    000x F84 fX6G KK##$:GD 
 DFeO$A+4+;T!c'!A3'cX[beHfgpHqAqD#(aGI(*!H *	@D==0MV]=^ccL)\9&|T[[ADzz"DEHh- +a* !(b cI09jTX>Y3y|,_cD0L M& #8D>#7#78<<S2$GJ	 L
 E 1		$%&WW-n%o
CMR\]gimRnBGG#?J#??tv  %&GGN$;	ENS]^gimSnrww&Ay&AAtv)3E):(6t(<(24(8(@(@(M '3w<;+F#*N5+8 $(1H?a"7!8GG $TAXT2$>?GFOU*	@X rD   c                   |sJ d       | j                  |      }ddi}| j                  j                  |       dddd}|rd| nd}|rd	| nd}|rd
| nd}|rd| nd}|rd| nd}|	rd|	 nd}	d|||||j                            | d| d| d| d| d|	 d}t	               }g }t        d      D ]  }| j                  dd|ddi      j                  }t        |      }|j                  dg       }|D ]  }|j                  d      }|s||vs|j                  |       |d   t        |      t        |d         t        |d         |d   |d   |d   d}|j                  |       |
sxt        |      |
k\  s|c c S  |j                  d       }||
s|c S |j                  d!      d"   j                  d#      d$   |d%<    |S )&a'  DuckDuckGo images search. Query params: https://duckduckgo.com/params.

        Args:
            keywords: keywords for query.
            region: us-en, uk-en, ru-ru, etc. Defaults to "us-en".
            safesearch: on, moderate, off. Defaults to "moderate".
            timelimit: Day, Week, Month, Year. Defaults to None.
            size: Small, Medium, Large, Wallpaper. Defaults to None.
            color: color, Monochrome, Red, Orange, Yellow, Green, Blue,
                Purple, Pink, Brown, Black, Gray, Teal, White. Defaults to None.
            type_image: photo, clipart, gif, transparent, line.
                Defaults to None.
            layout: Square, Tall, Wide. Defaults to None.
            license_image: any (All Creative Commons), Public (PublicDomain),
                Share (Free to Share and Use), ShareCommercially (Free to Share and Use Commercially),
                Modify (Free to Modify, Share, and Use), ModifyCommercially (Free to Modify, Share, and
                Use Commercially). Defaults to None.
            max_results: max number of results. If None, returns results only from the first response. Defaults to None.

        Returns:
            List of dictionaries with images search results.

        Raises:
            DuckDuckGoSearchException: Base exception for duckduckgo_search errors.
            RatelimitException: Inherits from DuckDuckGoSearchException, raised for exceeding API request rate limits.
            TimeoutException: Inherits from DuckDuckGoSearchException, raised for API request timeouts.
        r   zSec-Fetch-Modecorsr   -1onmoderateoffztime:r   zsize:zcolor:ztype:zlayout:zlicense:r`   ,)ors   lvqdpfr   rr   zhttps://duckduckgo.com/i.jsr   zhttps://duckduckgo.com/)r\   r:   r   imager   	thumbnailrk   heightwidthsource)r   r   r   rk   r   r   r   r   s=r   &r   s)rw   r=   r   rf   r   r   rp   r]   r   r6   r   r   r   r   split)r?   ru   r   r   r   sizecolor
type_imagelayoutlicense_imager   r   r:   safesearch_baser   r   r   r   rv   	resp_json	page_datarow	image_urlresultr   s                            rB   imageszDDGS.images  sB   P 000xmmH% f
 	""7+!$#dC+4eI;'"	!%tf~2$)& r-7uZL)R
'-76(#26C(=/2 !1!1!34;avQugQzl!F81]OT
 (*q 	>A==4WyZsNt ) g  #<0I!i4I  'GGG,	%!7IIi(!$W!/	!:%3C4D%E-c%j9"%h-!$W"%h-F NN6*"s7|{'B&'  ==(D|;::d+B/55c:1=GCL5	>8 rD   c	                   |sJ d       | j                  |      }	dddd}
|rd| nd}|rd| nd}|rd	| nd}|rd
| nd}|d||	| d| d| d| |
|j                            d}t               }g }t        d      D ]  }| j	                  dd|      j
                  }t        |      }|j                  dg       }|D ]F  }|d   |vs|j                  |d          |j                  |       |s3t        |      |k\  sB|c c S  |j                  d      }||s|c S |j                  d      d   j                  d      d   |d<    |S )a
  DuckDuckGo videos search. Query params: https://duckduckgo.com/params.

        Args:
            keywords: keywords for query.
            region: us-en, uk-en, ru-ru, etc. Defaults to "us-en".
            safesearch: on, moderate, off. Defaults to "moderate".
            timelimit: d, w, m. Defaults to None.
            resolution: high, standart. Defaults to None.
            duration: short, medium, long. Defaults to None.
            license_videos: creativeCommon, youtube. Defaults to None.
            max_results: max number of results. If None, returns results only from the first response. Defaults to None.

        Returns:
            List of dictionaries with videos search results.

        Raises:
            DuckDuckGoSearchException: Base exception for duckduckgo_search errors.
            RatelimitException: Inherits from DuckDuckGoSearchException, raised for exceeding API request rate limits.
            TimeoutException: Inherits from DuckDuckGoSearchException, raised for API request timeouts.
        r   r   r   -2r   zpublishedAfter:r   zvideoDefinition:zvideoDuration:zvideoLicense:r`   r   )r   r   rs   r   r   r      rr   zhttps://duckduckgo.com/v.jsrt   r   r]   r   r   r   r   r   r   )rw   rf   r   r   rp   r]   r   r6   r   r   r   r  )r?   ru   r   r   r   
resolutiondurationlicense_videosr   r   r  r   r   r   r   rv   r  r	  r
  r   s                       rB   videoszDDGS.videos  s   > 000xmmH%!$$tD5>oi[1B	8B'
|4
2:^H:.=K=(89QS;a
|1XJa7GH !1!1!34
 (*q 	>A==0MV]=^ffL"<0I!i4I  'y>.IIc)n-NN3'"s7|{'B&' ==(D|;::d+B/55c:1=GCL	>  rD   c           	     >   |sJ d       | j                  |      }dddd}|dd||||j                            d}|r||d<   t               }	g }
t        d	      D ]@  }| j	                  d
d|      j
                  }t        |      }|j                  dg       }|D ]  }|d   |	vs|	j                  |d          |j                  dd      }t        j                  |d   t        j                        j                         |d   t        |d         t        |d         t        |      |d   d}|
j!                  |       |st#        |
      |k\  s|
c c S  |j                  d      }||s|
c S |j%                  d      d   j%                  d      d   |d<   C |
S )aH  DuckDuckGo news search. Query params: https://duckduckgo.com/params.

        Args:
            keywords: keywords for query.
            region: us-en, uk-en, ru-ru, etc. Defaults to "us-en".
            safesearch: on, moderate, off. Defaults to "moderate".
            timelimit: d, w, m. Defaults to None.
            max_results: max number of results. If None, returns results only from the first response. Defaults to None.

        Returns:
            List of dictionaries with news search results.

        Raises:
            DuckDuckGoSearchException: Base exception for duckduckgo_search errors.
            RatelimitException: Inherits from DuckDuckGoSearchException, raised for exceeding API request rate limits.
            TimeoutException: Inherits from DuckDuckGoSearchException, raised for API request timeouts.
        r   r   r   r  r   r`   )r   r   noamprs   r   r   r   r   rr   zhttps://duckduckgo.com/news.jsrt   r   rk   r   Ndater   excerptr   )r  r   r   rk   r   r   r   r   r   r   r   r   )rw   rf   r   r   rp   r]   r   r6   r   r   fromtimestampr   utc	isoformatr   r   r   r   r  )r?   ru   r   r   r   r   r   r  r   r   r   r   rv   r  r	  r
  r  r  r   s                      rB   newsz	DDGS.newsY  s   2 000xmmH%!$$tD !1!1!34
 %GDM(*q 	>A==0PY`=aiiL"<0I!i4I  'u:U*IIc%j) # 6I ( 6 6s6{HLL Q [ [ ]!$W *3y> :-c%j9!/	!:"%h-F NN6*"s7|{'B&'  ==(D|;::d+B/55c:1=GCL1	>4 rD   )NNNr   T)r:   dict[str, str] | Noner'   
str | Noner@   zdict[str, str] | str | Noner(   
int | Noner.   boolreturnNone)r!  r   )NNN)rK   ztype[BaseException] | NonerL   zBaseException | NonerM   zTracebackType | Noner!  r"  )r!  rT   )g      ?)rX   floatr!  r"  )NNNNNNN)rm   zCLiteral['GET', 'HEAD', 'OPTIONS', 'DELETE', 'POST', 'PUT', 'PATCH']rk   r8   r\   r  r]   zbytes | Noner^   r  r:   r  r_   r  r`   r   r(   zfloat | Noner!  r   )ru   r8   r!  r8   )Nr   Nr{   N)ru   r8   r   r  r   r8   r   r  r   r8   r   r  r!  list[dict[str, str]])
ru   r8   r   r  r   r  r   r  r!  r$  )	us-enr   NNNNNNN)ru   r8   r   r8   r   r8   r   r  r  r  r  r  r  r  r  r  r  r  r   r  r!  r$  )r%  r   NNNNN)ru   r8   r   r8   r   r8   r   r  r  r  r  r  r  r  r   r  r!  r$  )r%  r   NN)ru   r8   r   r8   r   r8   r   r  r   r  r!  r$  )rh   
__module____qualname____doc__rC   rI   rN   r   rU   rZ   rp   rw   r   r   r   r   r  r  r  rG   rD   rB   r   r   !   s   L *. /3 -#&-# -# -	-#
 -# -# 
-#^
 04(,'+	, & %	
 
 m m )- $&*)-)- $"aS"a "a &	"a
 "a $"a '"a '"a "a "a 
"aH4 "$ $"&4-4- 4- 	4-
 4- 4-  4- 
4-r " $"&II I 	I
  I 
I\ " $"&SS S 	S
  S 
Sp " $"&GG G 	G
  G 
GX $ $ !%!$("&`` ` 	`
 ` ` ` ` ` "`  ` 
`J $ $!%#%)"&DD D 	D
 D D D #D  D 
DR $ $"&FF F 	F
 F  F 
FrD   r   ),
__future__r   r   loggingr4   r0   r   r   	functoolsr   	itertoolsr   r&   r   r
   r	   typesr   typingr   r   urllib.parser   r   r;   
lxml.etreer   	lxml.htmlr   rT   r   
exceptionsr   r   r   utilsr   r   r   r   r   	getLoggerri   r   rG   rD   rB   <module>r5     si    "   	  ' %      +   / ) W W  
		3	4~	 ~	rD   