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()