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