import re import htmlmin import datetime from functions import sanitizeUrl from newspaper import Article class News(): r=re.compile(r"hours? ago|yesterday|today|last week|month",flags=re.IGNORECASE) r_noise=re.compile(r"posted|Product|Google",flags=re.IGNORECASE) URL="" AUTHORS=[] SCRAP_DATE=None PUBLISH_DATE=None SUMMARY="" TEXT="" HTML="" ERROR=False SOURCE="" SOURCENAME="" WEIGHT_SUM=0 MATCHES=False MATCHING_KW=[] TITLE="" def __init__(self,url,sourceid, sourcename,kw,lang="en",html=None): url=sanitizeUrl(url) self.URL=url self.SOURCENAME=sourcename self.SOURCE=sourceid self.MATCHING_KW=[] a=None try: if html is None: a = Article(url, language=lang,keep_article_html=True,request_timeout=10) a.download() else: a= Article("",keep_article_html=True) a.set_html(html) a.parse() a.nlp() except Exception as e: print("ERROR parsing/downloading/nlp article") print(e) if html is not None: print(len(html)) self.ERROR=True self.MATCHES=False return a.authors=self.dedup([self.fix_author(value) for value in a.authors if not self.isComment(value) and not self.isNoise(value)]) self.SCRAP_DATE=datetime.datetime.now() self.AUTHORS=a.authors self.PUBLISH_DATE=a.publish_date self.SUMMARY=a.summary self.TEXT=a.text self.TITLE=a.title self.HTML=htmlmin.minify(a.article_html,remove_empty_space=True) # if html is None: # self.HTML=htmlmin.minify(a.article_html,remove_empty_space=True) # else: # self.HTML=htmlmin.minify(html,remove_empty_space=True) self.ERROR=False lowertext=self.TEXT.lower() ret=match_keywords(kw,lowertext) self.MATCHES=ret["matches"] self.WEIGHT_SUM=ret["weight"] self.MATCHING_KW=ret["kw"] def get(self): return { "url": self.URL, "source": self.SOURCE, "source_name": self.SOURCENAME, "authors": self.AUTHORS, "scrap_date": self.SCRAP_DATE, "publish_date": self.PUBLISH_DATE, "summary": self.SUMMARY, "text": self.TEXT, "matches": self.MATCHES, "weight": self.WEIGHT_SUM, "kw": self.MATCHING_KW, "html": self.HTML, "error": self.ERROR, "deleted": False, "title": self.TITLE } def dedup(self,val): return list(set(val)) def isNoise(self,v): if self.r_noise.match(v): return True return False def isComment(self,v): if self.r.match(v): return True return False def fix_author(self,a): return a.replace("_", " ").lower() def match_keywords(keywords, lowertext): w_sum=0 matching=[] matches=False for k in keywords: num_matches=len( [ 1 for kwp in k["pattern"] if kwp.search(lowertext) ] ) if num_matches==len(k["pattern"]): w_sum+=k["weight"] matching.append(k["kw"]) matches=True ret=({"matches":matches,"weight":w_sum,"kw":matching}) return ret