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