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="" WEIGHT_SUM=0 MATCHES=False MATCHING_KW=[] TITLE="" def __init__(self,url,source,kw,lang="en"): url=sanitizeUrl(url) self.URL=url self.SOURCE=source self.MATCHING_KW=[] a = Article(url, language=lang,keep_article_html=True) try: a.download() a.parse() except Exception: print("ERROR parsing/downloading article") self.ERROR=True return a.nlp() 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) self.ERROR=False lowertext=self.TEXT.lower() for k in kw: #if re.match(k["pattern"], self.TEXT): #FIXME regex vs string in string matches=len( [ 1 for kwp in k["pattern"] if kwp in lowertext ] ) if matches==len(k["pattern"]): self.WEIGHT_SUM+=k["weight"] self.MATCHING_KW.append(k["kw"]) self.MATCHES=True def get(self): return { "url": self.URL, "source": self.SOURCE, "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, "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()