news.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. SOURCENAME=""
  19. WEIGHT_SUM=0
  20. MATCHES=False
  21. MATCHING_KW=[]
  22. TITLE=""
  23. def __init__(self,url,sourceid, sourcename,kw,lang="en"):
  24. url=sanitizeUrl(url)
  25. self.URL=url
  26. self.SOURCENAME=sourcename
  27. self.SOURCE=sourceid
  28. self.MATCHING_KW=[]
  29. a = Article(url, language=lang,keep_article_html=True,request_timeout=10)
  30. try:
  31. a.download()
  32. a.parse()
  33. a.nlp()
  34. except Exception as e:
  35. print("ERROR parsing/downloading/nlp article")
  36. print(e)
  37. self.ERROR=True
  38. self.MATCHES=False
  39. return
  40. a.authors=self.dedup([self.fix_author(value) for value in a.authors if not self.isComment(value) and not self.isNoise(value)])
  41. self.SCRAP_DATE=datetime.datetime.now()
  42. self.AUTHORS=a.authors
  43. self.PUBLISH_DATE=a.publish_date
  44. self.SUMMARY=a.summary
  45. self.TEXT=a.text
  46. self.TITLE=a.title
  47. self.HTML=htmlmin.minify(a.article_html,remove_empty_space=True)
  48. self.ERROR=False
  49. lowertext=self.TEXT.lower()
  50. for k in kw:
  51. #if re.match(k["pattern"], self.TEXT): #FIXME regex vs string in string
  52. matches=len( [ 1 for kwp in k["pattern"] if kwp in lowertext ] )
  53. if matches==len(k["pattern"]):
  54. self.WEIGHT_SUM+=k["weight"]
  55. self.MATCHING_KW.append(k["kw"])
  56. self.MATCHES=True
  57. def get(self):
  58. return {
  59. "url": self.URL,
  60. "source": self.SOURCE,
  61. "source_name": self.SOURCENAME,
  62. "authors": self.AUTHORS,
  63. "scrap_date": self.SCRAP_DATE,
  64. "publish_date": self.PUBLISH_DATE,
  65. "summary": self.SUMMARY,
  66. "text": self.TEXT,
  67. "matches": self.MATCHES,
  68. "weight": self.WEIGHT_SUM,
  69. "kw": self.MATCHING_KW,
  70. "html": self.HTML,
  71. "error": self.ERROR,
  72. "title": self.TITLE
  73. }
  74. def dedup(self,val):
  75. return list(set(val))
  76. def isNoise(self,v):
  77. if self.r_noise.match(v):
  78. return True
  79. return False
  80. def isComment(self,v):
  81. if self.r.match(v):
  82. return True
  83. return False
  84. def fix_author(self,a):
  85. return a.replace("_", " ").lower()