news.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import re
  2. import htmlmin
  3. import datetime
  4. from functions import sanitizeUrl
  5. from newspaper import Article
  6. class News():
  7. r=re.compile(r"hours? ago|yesterday|today|last week|month",flags=re.IGNORECASE)
  8. r_noise=re.compile(r"posted|Product|Google",flags=re.IGNORECASE)
  9. URL=""
  10. AUTHORS=[]
  11. SCRAP_DATE=None
  12. PUBLISH_DATE=None
  13. SUMMARY=""
  14. TEXT=""
  15. HTML=""
  16. ERROR=False
  17. SOURCE=""
  18. WEIGHT_SUM=0
  19. MATCHES=False
  20. MATCHING_KW=[]
  21. def __init__(self,url,source,kw,lang="en"):
  22. url=sanitizeUrl(url)
  23. self.URL=url
  24. self.SOURCE=source
  25. a = Article(url, language=lang,keep_article_html=True)
  26. try:
  27. a.download()
  28. a.parse()
  29. return
  30. except Exception:
  31. print("ERROR parsing/downloading article")
  32. ERROR=True
  33. return
  34. a.nlp()
  35. a.authors=self.dedup([self.fix_author(value) for value in a.authors if not self.isComment(value) and not self.isNoise(value)])
  36. self.SCRAP_DATE=datetime.datetime.now()
  37. self.AUTHORS=a.authors
  38. self.PUBLISH_DATE=a.publish_date
  39. self.SUMMARY=a.summary
  40. self.TEXT=a.text
  41. self.HTML=htmlmin.minify(a.article_html,remove_empty_space=True)
  42. for k in kw:
  43. if re.match(k["pattern"], self.TEXT):
  44. self.WEIGHT_SUM+=k["weight"]
  45. self.MATCHING_KW.append(k["kw"])
  46. self.MATCHES=True
  47. def get(self):
  48. return {
  49. "url": self.URL,
  50. "source": self.SOURCE,
  51. "authors": self.AUTHORS,
  52. "scrap_date": self.SCRAP_DATE,
  53. "publish_date": self.PUBLISH_DATE,
  54. "summary": self.SUMMARY,
  55. "text": self.TEXT,
  56. "matches": self.MATCHES,
  57. "weight": self.WEIGHT_SUM,
  58. "kw": self.MATCHING_KW,
  59. "html": self.HTML
  60. }
  61. def dedup(self,val):
  62. return list(set(val))
  63. def isNoise(self,v):
  64. if self.r_noise.match(v):
  65. return True
  66. return False
  67. def isComment(self,v):
  68. if self.r.match(v):
  69. return True
  70. return False
  71. def fix_author(self,a):
  72. return a.replace("_", " ").lower()