
    AHj%                        d Z ddl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	 ddl
mZmZmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZmZ  ej2                  e      Z ej8                  d      Z ej8                  dej<                        Z ej8                  d      Z  ej8                  d      Z! ej8                  d      Z" ej8                  d      Z# ej8                  d      Z$ ej8                  d      Z% ej8                  d      Z&g dZ' G d d      Z(dddefde)de)dz  de*de+de,de-e)   fd Z.de)d!e)dz  de*fd"Z/d#e)de-e)   fd$Z0d%e)dz  d#e)de-e)   fd&Z1y)'z#
Deriving link info from sitemaps.
    N)Callable)islice)Pattern)sleep)	clean_urlextract_domainfilter_urlsfix_relative_urlsget_hostinfolang_filter   )is_similar_domain)	fetch_urlis_live_page)	MAX_LINKSMAX_SITEMAPS_SEENz.<loc>(?:<!\[CDATA\[)?(http.+?)(?:\]\]>)?</loc>z<xhtml:link.+?>zhref=["\'](.+?)["\']zg(?:blogger|blogpost|ghost|hubspot|livejournal|medium|typepad|squarespace|tumblr|weebly|wix|wordpress)\.z^.{0,5}<\?xml|<sitemap|<urlsetz\.xml(\..{2,4})?$|\.xml[?#]zhttps?://[^\s<"]+z
\?.*$|#.*$z\.xml\b)zsitemap.xmlzsitemap.xml.gzsitemapzsitemap_index.xmlzsitemap_news.xmlc                       e Zd ZdZg dZ	 	 ddededee   dedz  ded	dfd
ZddZ	ded	dfdZ
dee   dedeegdf   d	dfdZddZddZddZy)SitemapObjectzCStore all necessary information on sitemap download and processing.)	base_urlcontentcurrent_urldomainexternalseensitemap_urlstarget_langurlsNr   r   sitemapsurlsr   r   returnc                     || _         d| _        || _        || _        d| _        t               | _        || _        || _        g | _	        y )N )
r   r   r   r   r   setr   r   r   r   )selfr   r   r   r   r   s         L/root/tools/cai/cai_env/lib/python3.12/site-packages/trafilatura/sitemaps.py__init__zSitemapObject.__init__@   sH     &!& "!e	'3'2!	    c                     t         j                  d| j                         t        | j                        xs d| _        | j
                  j                  | j                         y)z!Fetch a sitemap over the network.zfetching sitemap: %sr"   N)LOGGERdebugr   r   r   r   addr$   s    r%   fetchzSitemapObject.fetchR   sD    +T-=-=> !1!128b		d&&'r'   linkc                 L   || j                   k(  ryt        | j                  |      }t        || j                        xs d}|rt        || j                        syt        |d      }|t        j                  d|       y| j                  sMt        j                  |      s8t        | j                  |      s"t        j                  d| j                  |       yt        j                  |      r| j                   j#                  |       y| j$                  j#                  |       y)z^Examine a link and determine if it's valid and if it leads to
        a sitemap or a web page.Nr"   T)fastzcouldn't extract domain: %sz-link discarded, diverging domain names: %s %s)r   r
   r   r   r   r   r   r)   errorr   WHITELISTED_PLATFORMSsearchr   r   warningDETECT_SITEMAP_LINKr   appendr   )r$   r.   	newdomains      r%   handle_linkzSitemapObject.handle_linkX   s     4### 5t//06B;tT-=-=>"4d3	LL6= }}%:%A%A)%LUfgkgrgrt}U~NNJDKKYbc%%d+$$T*IIT"r'   regexindexhandlerc                    fdt        |j                  | j                        t              D        D ]
  } ||        t        j                  dt        | j                        t        | j                        | j                         y)zJExtract links from the content using pre-defined regex, index and handler.c              3   (   K   | ]	  }|     y w)N ).0mr:   s     r%   	<genexpr>z.SitemapObject.extract_links.<locals>.<genexpr>v   s     X1ahXs   z%%s sitemaps and %s links found for %sN)
r   finditerr   r   r)   r*   lenr   r   r   )r$   r9   r:   r;   matchs     `  r%   extract_linkszSitemapObject.extract_linkst   sc    Xu~~dll/KY(WX 	EEN	3!!"		N		
r'   c                      d j                   vryt        j                  d j                   dt        j                        dt
        ddf fd} j                  t        d|       y)	z7Extract links corresponding to a given target language.z	hreflang=Nzhreflang=[\"'](z.*?|x-default)[\"']attrsr    c                     j                  |       r-t        j                  |       }|rj                  |d          yyy)z!Examine language code attributes.r   N)r3   HREFLANG_REGEXr8   )rG   
lang_match
lang_regexr$   s     r%   handle_lang_linkzASitemapObject.extract_sitemap_langlinks.<locals>.handle_lang_link   s@      '+2259
$$Z]3  (r'   r   )r   recompiler   DOTALLstrrE   XHTML_REGEX)r$   rL   rK   s   ` @r%   extract_sitemap_langlinksz'SitemapObject.extract_sitemap_langlinks   sb    dll*ZZ?43C3C2DDW XZ\ZcZcd
	4C 	4D 	4 	;+;<r'   c                 F    | j                  t        d| j                         y)z=Extract sitemap links and web page links from a sitemap file.r   N)rE   
LINK_REGEXr8   r,   s    r%   extract_sitemap_linksz#SitemapObject.extract_sitemap_links   s    :q$*:*:;r'   c                 V   t        | j                  | j                        }|syt        j	                  | j                        s"| j                  t        d| j                         y| j                  )| j                          | j                  s| j                  ry| j                          y)z5Download a sitemap and extract the links it contains.Nr   )is_plausible_sitemapr   r   SITEMAP_FORMATrD   rE   DETECT_LINKSr8   r   rR   r   r   rU   )r$   	plausibles     r%   processzSitemapObject.process   s    ()9)94<<H	##DLL1|Q0@0@A'**,  DII""$r'   )NF)r    N)__name__
__module____qualname____doc__	__slots__rP   listboolr&   r-   r8   r   intr   rE   rR   rU   r[   r>   r'   r%   r   r   1   s    I
I" #'"" " 3i	"
 4Z" " 
"$(# # #8	
73< 	
 	
hPSuVZ{F[ 	
`d 	
= <%r'   r   Fg       @urlr   r   
sleep_timemax_sitemapsr    c                    t        |       \  }}|t        j                  d|        g S t        |      st        j                  d|        g S d}| j	                  d      r| g}ng }t        |       t        |      dz   kD  r| }t        |||||      }	|	j                  s+t        |      xs t        D 
cg c]	  }
| d|
  c}
|	_        |	j                  rt        |	j                        |k  r|	j                  j                         |	_        |	j                          |	j                          |	j                  D cg c]  }||	j                  vs| c}|	_        t        |	j                        |k  rt        |       |	j                  rt        |	j                        |k  r|rt!        |	j"                  |      |	_        t        j%                  dt        |	j"                        |       |	j"                  S c c}
w c c}w )ax  Look for sitemaps for the given URL and gather links.

    Args:
        url: Webpage or sitemap URL as string.
             Triggers URL-based filter if the webpage isn't a homepage.
        target_lang: Define a language to filter URLs based on heuristics
                     (two-letter string, ISO 639-1 format).
        external: Similar hosts only or external URLs
                  (boolean, defaults to False).
        sleep_time: Wait between requests on the same website.
        max_sitemaps: Maximum number of sitemaps to process.

    Returns:
        The extracted links as a list (sorted list of unique links).

    Nzinvalid URL: %sz*base URL unreachable, dropping sitemap: %s)z.gzr   z.xml   /z%s sitemap links found for %s)r   r)   r4   r   endswithrC   r   r   find_robots_sitemapsGUESSESr   popr   r-   r[   r   r	   r   r*   )rd   r   r   re   rf   
domainnamebaseurl	urlfiltersitemapurlsr   gss               r%   sitemap_searchrt      s   . 's+J(#.	 CSI	I
||./es8c'lQ&&IGZk8TG 3G<c[b@cVWG9AaSAQ@c 

3w||#4|#C%22668+2+?+?Ya1GLLCXYw|||+* 

3w||#4|#C "7<<;
LL0#gll2CZP<<# Ad  Zs   1G38G8G8contentsc                    |yt         j                  d|       } t        j                  |       r%t	        |t
              r*t        j                  |      rd|dd j                         v rt        j                  d|        yy)zLCheck if the sitemap corresponds to an expected format,
    i.e. TXT or XML.NFr"   z<html   znot a valid XML sitemap: %sT)SCRUB_REGEXsubPOTENTIAL_SITEMAPr3   
isinstancerP   rX   rD   lowerr)   r4   )rd   ru   s     r%   rW   rW      sr      //"c
"C 	  %Hc*.2F2Fx2Phtn**,,4c:r'   ro   c                 6    t        | dz         }t        ||       S )zUGuess the location of the robots.txt file and try to extract
    sitemap URLs from itz/robots.txt)r   extract_robots_sitemaps)ro   	robotstxts     r%   rk   rk      s      'M12I"9g66r'   r   c                 P   | t        |       dkD  rg S g }| j                         D ]  }|j                  d      }|dk\  r|d| }|j                         }|s1|j	                  dd      }t        |      dk(  sR|d   j                         j                         |d<   |d   dk(  s|j                  |d   j                                 t        t        j                  |            }|D cg c]  }|st        ||       }}t        j                  d	t        |             |S c c}w )
z.Read a robots.txt file and find sitemap links.Ni'  #r   :r   rh   r   z%s sitemaps found in robots.txt)rC   
splitlinesfindstripsplitr|   r6   ra   dictfromkeysr
   r)   r*   )r   ro   
candidateslinei
line_partsurq   s           r%   r~   r~     s    C	NU2	J$$& 9IIcN68Dzz|ZZQ'
z?a&qM//1779JqM!}	)!!*Q-"5"5"789 dmmJ/0J:DJQ$Wa0JKJ
LL2C4DE Ks   *D#2D#)2r_   loggingrM   collections.abcr   	itertoolsr   r   timer   courlanr   r   r	   r
   r   r   deduplicationr   	downloadsr   r   settingsr   r   	getLoggerr\   r)   rN   rT   rO   rQ   rI   r2   rX   r5   rY   rx   rz   rl   r   rP   rb   floatrc   ra   rt   rW   rk   r~   r>   r'   r%   <module>r      s    	 $     - . 2			8	$RZZIJ
bjj+RYY734"

n  => bjj!?@ rzz./bjj'BJJz* q% q%l #)?	?t? ? 	?
 ? 
#Y?Dc S4Z D *7# 7$s) 7sTz C DI r'   