news.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. CATEGORY=0
  24. def __init__(self,url,sourceid, sourcename,sourcecategory,kw,lang="en",html=None):
  25. url=sanitizeUrl(url)
  26. self.URL=url
  27. self.SOURCENAME=sourcename
  28. self.SOURCE=sourceid
  29. self.CATEGORY=sourcecategory
  30. self.MATCHING_KW=[]
  31. a=None
  32. try:
  33. if html is None:
  34. a = Article(url, language=lang,keep_article_html=True,request_timeout=10)
  35. a.download()
  36. else:
  37. a= Article("",keep_article_html=True)
  38. a.set_html(html)
  39. a.parse()
  40. a.nlp()
  41. except Exception as e:
  42. print("ERROR parsing/downloading/nlp article")
  43. print(e)
  44. if html is not None:
  45. print(len(html))
  46. self.ERROR=True
  47. self.MATCHES=False
  48. return
  49. a.authors=self.dedup([self.fix_author(value) for value in a.authors if not self.isComment(value) and not self.isNoise(value)])
  50. self.SCRAP_DATE=datetime.datetime.now()
  51. self.AUTHORS=a.authors
  52. self.PUBLISH_DATE=a.publish_date
  53. self.SUMMARY=a.summary
  54. self.TEXT=a.text
  55. self.TITLE=a.title
  56. self.HTML=htmlmin.minify(a.article_html,remove_empty_space=True)
  57. # if html is None:
  58. # self.HTML=htmlmin.minify(a.article_html,remove_empty_space=True)
  59. # else:
  60. # self.HTML=htmlmin.minify(html,remove_empty_space=True)
  61. self.ERROR=False
  62. lowertext=self.TEXT.lower()
  63. ret=match_keywords(kw,lowertext)
  64. self.MATCHES=ret["matches"]
  65. self.WEIGHT_SUM=ret["weight"]
  66. self.MATCHING_KW=ret["kw"]
  67. def get(self):
  68. return {
  69. "url": self.URL,
  70. "source": self.SOURCE,
  71. "source_name": self.SOURCENAME,
  72. "authors": self.AUTHORS,
  73. "scrap_date": self.SCRAP_DATE,
  74. "publish_date": self.PUBLISH_DATE,
  75. "summary": self.SUMMARY,
  76. "text": self.TEXT,
  77. "matches": self.MATCHES,
  78. "weight": self.WEIGHT_SUM,
  79. "kw": self.MATCHING_KW,
  80. "html": self.HTML,
  81. "error": self.ERROR,
  82. "deleted": False,
  83. "category": self.CATEGORY,
  84. "title": self.TITLE
  85. }
  86. def dedup(self,val):
  87. return list(set(val))
  88. def isNoise(self,v):
  89. if self.r_noise.match(v):
  90. return True
  91. return False
  92. def isComment(self,v):
  93. if self.r.match(v):
  94. return True
  95. return False
  96. def fix_author(self,a):
  97. return a.replace("_", " ").lower()
  98. def match_keywords(keywords, lowertext):
  99. w_sum=0
  100. matching=[]
  101. matches=False
  102. for k in keywords:
  103. num_matches=len( [ 1 for kwp in k["pattern"] if kwp.search(lowertext) ] )
  104. if num_matches==len(k["pattern"]):
  105. w_sum+=k["weight"]
  106. matching.append(k["kw"])
  107. matches=True
  108. ret=({"matches":matches,"weight":w_sum,"kw":matching})
  109. return ret