
    AHj#                        d Z ddlZddlZddl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 dd	lmZ dd
lmZ  ej.                  e      Zh dZ ej6                  d      Z ej6                  d      Z ej6                  d      Z ej6                  dej>                        Z  ej6                  d      Z! ej6                  d      Z" G d d      Z#de$de%fdZ&de'e$   de#de'e$   fdZ(de$de#de'e$   fdZ)de$de#de'e$   fdZ*de$de#de'e$   fdZ+de#de$dz  de'e$   fdZ,	 	 	 d'd e$d!e$dz  d"e%d#e-de'e$   f
d$Z.d%e$d!e$dz  de'e$   fd&Z/y)(z>
Examining feeds and extracting links for further processing.
    N)islice)sleep)	check_url	clean_urlfilter_urlsfix_relative_urlsget_hostinfois_valid_url   )is_similar_domain)	fetch_url)	MAX_LINKS)	load_html>   text/rdftext/rsstext/xml	text/atom
text/plaintext/rdf+xmltext/rss+xmltext/atom+xmlapplication/rdfapplication/rssapplication/xmlapplication/atomapplication/jsonapplication/rdf+xmlapplication/rss+xmlapplication/atom+xmlapplication/feed+jsonapplication/x-atom+xmlapplication/x.atom+xmlz<(feed|rss|\?xml)z<link .*?href=".+?"zhref="(.+?)"z:<link>(?:\s*)(?:<!\[CDATA\[)?(.+?)(?:\]\]>)?(?:\s*)</link>z\bcomments\bzn\.(?:atom|rdf|rss|xml)$|\b(?:atom|rss)\b|\?type=100$|feeds/posts/default/?$|\?feed=(?:atom|rdf|rss|rss2)|feed$c                   D    e Zd ZdZg dZ	 	 ddedededededz  d	dfd
Zy)FeedParametersz.Store necessary information to proceed a feed.basedomainextlangrefNbaseurlr'   	referenceexternaltarget_langreturnc                 J    || _         || _        || _        || _        || _        y )Nr%   )selfr+   r'   r,   r-   r.   s         I/root/tools/cai/cai_env/lib/python3.12/site-packages/trafilatura/feeds.py__init__zFeedParameters.__init__J   s'     !	!! +	!    )FN)__name__
__module____qualname____doc__	__slots__strboolr3    r4   r2   r$   r$   E   sU    48I "&"" " 	"
 " 4Z" 
"r4   r$   feed_stringr/   c                 L    t         j                  |       ry| dd }d|v xs d|v S )z$Check if the string could be a feed.TNd   z<rssz<feed)FEED_OPENINGmatch)r=   	beginnings     r2   is_potential_feedrC   Y   s4    +&DS!IY6'Y"66r4   linklistparamsc                    g }t        t        |             D ]  }t        |j                  |      }t	        ||j
                        }|c|j                  sBd|vr>t        |j                  |d         s%t        j                  d|j                  |d          |j                  |d          d|v sd|v s|j                  |        |S )zGExamine links to determine if they are valid and
    lead to a web page)languagefeedr   z'Rejected, diverging domain names: %s %sr   
feedburner	feedproxy)sortedsetr   r&   r   r)   r(   r   r'   LOGGERwarningappend)rD   rE   output_linksitemlinkcheckeds         r2   handle_link_listrT   a   s     Ls8}% & d3D6;;7::&"4=Nv}}^efg^h=iH&--Y`abYcd##GAJ/T![D%8%& r4   c                 B   t        |       s| j                  d      rh	 t        j                  |       j	                  dg       D cg c]&  }|j	                  d      xs |j	                  d      ( }}|D cg c]  }||	 c}S t        j                  d|j                         g S d| v rVd t        t        j                  |       t              D        D cg c]"  }d	|vrd
|vrt        j                  |      d   $ c}S d| v rBt        t         j                  |       t              D cg c]  }|d   j#                          c}S g S c c}w c c}w # t        j
                  j                  $ r$ t        j                  d|j                         Y g S w xY wc c}w c c}w )z<Try different feed types and return the corresponding links.{itemsurlidzJSON decoding error: %szPossibly invalid feed: %sz<link c              3   &   K   | ]	  }|d      yw)r   Nr<   ).0ms     r2   	<genexpr>zfind_links.<locals>.<genexpr>   s     [!1[s   zatom+xmlz
rel="self"r   z<link>)rC   
startswithjsonloadsgetdecoderJSONDecodeErrorrM   debugr'   r   
LINK_ATTRSfinditerr   	LINK_HREFsearchLINK_ELEMENTSstrip)r=   rE   rQ   
candidatescrR   r\   s          r2   
find_linksrm   v   su   [)!!#&GLPJJWbLcLgLghoqsLtuDdhhuo?$?u
u#-?a?? LL4fmmD	 ; \vj.A.A+.NPY'Z[
%,d*B T"1%
 	
 ;&,]-C-CK-PR[&\]!

]]I- v?<<// G6F 		G
 ^sA   'E +E	0E 6E>EE 'F*F	
E =FFc                    | s"t         j                  d|j                         g S t        | j	                         |      }t        ||      D cg c])  }||j                  k7  s|j                  d      dkD  s(|+ }}|r+t         j                  dt        |      t        |             |S t         j                  d|j                         |S c c}w )z7Extract and refine links from Atom, RSS and JSON feeds.zEmpty feed: %s/   z!Links found: %s of which %s validzInvalid feed for %s)	rM   rd   r'   rm   rj   rT   r*   countlen)r=   rE   
feed_linksrR   rP   s        r2   extract_linksrt      s    %v}}5	K--/8J%5j&%IxTTU[U_U_M_dhdndnordsvwdwDxLx8#j/3|K\]  	*FMM: ys   C"C7C
htmlstringc           	      P   t        |       }|"t        j                  d|j                         g S |j	                  d      D cg c]P  }|j                  d      t        v s%t        j                  |j                  dd            r|j                  dd      R }}|sT|j	                  d      D cg c]:  }t        j                  |j                  dd            s)|j                  dd      < }}g }t        j                  |      D ]i  }t        |j                  |      }t        |      }|s'||j                  k7  s7t        |      sCt        j                  |      rY|j!                  |       k t        j                  dt#        |      t#        |             |S c c}w c c}w )zxParse the HTML and try to extract feed URLs from the home page.
    Adapted from http://www.aaronsw.com/2002/feedfinder/zInvalid HTML/Feed page: %sz//link[@rel="alternate"][@href]typehref z
//a[@href]z%Feed URLs found: %s of which %s valid)r   rM   rd   r&   xpathra   
FEED_TYPESLINK_VALIDATION_RErh   dictfromkeysr   r   r*   r
   	BLACKLISTrO   rr   )ru   rE   treerR   	feed_urlsoutput_urlss         r2   determine_feedr      sq    Z D|16;;?	
 JJ@A88Fz)-?-F-FtxxPVXZG[-\ 	I  -1ZZ-E
%)I[IbIbcgckcklrtvcwIxDHHVR 
	 

 Ki( % d3DFJJ&<+=iFVFVW[F\t$	% LL8#i.#kJZ[-
s   AF/*F#F#	urlfilterc                     | j                   rlt        d| j                   d| j                    d      }|rDt        ||       }t	        ||      }t
        j                  dt        |      | j                         |S g S )z2Alternative way to gather feed links: Google News.z*https://news.google.com/rss/search?q=site:z&hl=z&scoring=n&num=100z!%s Google news links found for %s)r)   r   r'   rt   r   rM   rd   rr   )rE   r   
downloadedrs   s       r2   probe_gnewsr      sp    {{!KFMM?Z^_e_j_j^kk}~
&z6:J$Z;JLL<c*ov}}]Ir4   rX   r.   r-   
sleep_timec                 ~   t        |       \  }}|t        j                  d|        g S t        ||| ||      }d}t	        |       }|t        ||      }	|	sVt        ||      D ]+  }
t	        |
      }|s|	j                  t        ||             - t        |       t        |      dz   kD  r| }|	r.t        |	|      }	t        j                  dt        |	      |       |	S t        j                  d|        nAt        j                  d|        | j                  d      |k7  rt        |       t        ||      S t        ||      S )a  Try to find feed URLs.

    Args:
        url: Webpage or feed 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.

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

    NzInvalid URL: %srp   z%s feed links found for %szNo usable feed links found: %szCould not download web page: %sro   )r	   rM   rN   r$   r   rt   r   extendrr   r   rd   errorrj   r   try_homepager   )rX   r.   r-   r   r'   r+   rE   r   r   rs   rH   r=   s               r2   find_feed_urlsr      s/   * #3'OFG~(#.	GVS(KHFI3J":v6
&z6: J'o%%mK&HIJ
 3x#g,**	$Z;JLL5s:O5s;6<99S>W$*55vy))r4   r+   c                 F    t         j                  d|        t        | |      S )zhShift into reverse and try the homepage instead of the particular feed
    page that was given as input.z&Probing homepage for feeds instead: %s)rM   rd   r   )r+   r.   s     r2   r   r     s      LL97C';//r4   )NFg       @)0r8   r_   loggingre	itertoolsr   timer   courlanr   r   r   r   r	   r
   deduplicationr   	downloadsr   settingsr   utilsr   	getLoggerr5   rM   r{   compiler@   re   rg   DOTALLri   r   r|   r$   r:   r;   rC   listrT   rm   rt   r   r   floatr   r   r<   r4   r2   <module>r      s     	    -    			8	$
, rzz./RZZ./
BJJ'	

XZ\ZcZcdBJJ'	RZZ " "(73 74 7tCy . T#Y *C  DI @s N tCy $s N tCy D	 	3: 	$s) 	 #	6*	6*t6* 6* 	6*
 
#Y6*r0# 0C$J 049 0r4   