news.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import re
  2. import htmlmin
  3. import datetime
  4. import html
  5. from functions import sanitizeUrl
  6. from newspaper import Article,Config
  7. class News():
  8. r=re.compile(r"hours? ago|yesterday|today|last week|month",flags=re.IGNORECASE)
  9. r_noise=re.compile(r"posted|Product|Google",flags=re.IGNORECASE)
  10. URL=""
  11. LOWERURL=""
  12. AUTHORS=[]
  13. SCRAP_DATE=None
  14. PUBLISH_DATE=None
  15. SUMMARY=""
  16. TEXT=""
  17. HTML=""
  18. ERROR=False
  19. SOURCE=""
  20. SOURCENAME=""
  21. WEIGHT_SUM=0
  22. MATCHES=False
  23. MATCHING_KW=[]
  24. TITLE=""
  25. CATEGORY=0
  26. def __init__(self,url,sourceid, sourcename,sourcecategory,kw,lang="en",html=None):
  27. url=sanitizeUrl(url)
  28. self.URL=url
  29. self.LOWERURL=url.lower()
  30. self.SOURCENAME=sourcename
  31. self.SOURCE=sourceid
  32. self.CATEGORY=sourcecategory
  33. self.MATCHING_KW=[]
  34. config = Config()
  35. config.language=lang
  36. config.memoize_articles=False
  37. config.keep_article_html=True
  38. config.request_timeout=15
  39. config.fetch_images=False
  40. config.browser_user_agent="Mozilla/5.0 (X11; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"
  41. a=None
  42. try:
  43. a = Article(url=url, config=config)
  44. a.download(html=html)
  45. a.parse()
  46. a.nlp()
  47. except Exception as e:
  48. print("ERROR parsing/downloading/nlp article")
  49. print(e)
  50. print(url)
  51. print(sourcename)
  52. if html is not None:
  53. print(len(html))
  54. self.ERROR=True
  55. self.MATCHES=False
  56. return
  57. a.authors=self.dedup([self.fix_author(value) for value in a.authors if not self.isComment(value) and not self.isNoise(value)])
  58. self.SCRAP_DATE=datetime.datetime.now()
  59. self.AUTHORS=a.authors
  60. self.PUBLISH_DATE=a.publish_date
  61. self.SUMMARY=a.summary
  62. self.TEXT=a.text
  63. self.TITLE=self.fix_title(a.title)
  64. self.HTML=htmlmin.minify(a.article_html,remove_empty_space=True)
  65. # if html is None:
  66. # self.HTML=htmlmin.minify(a.article_html,remove_empty_space=True)
  67. # else:
  68. # self.HTML=htmlmin.minify(html,remove_empty_space=True)
  69. self.ERROR=False
  70. lowertext=self.TEXT.lower()
  71. ret=match_keywords(kw,lowertext)
  72. self.MATCHES=ret["matches"]
  73. self.WEIGHT_SUM=ret["weight"]
  74. self.MATCHING_KW=ret["kw"]
  75. def get(self):
  76. return {
  77. "url": self.URL,
  78. "lowerurl": self.LOWERURL,
  79. "source": self.SOURCE,
  80. "source_name": self.SOURCENAME,
  81. "authors": self.AUTHORS,
  82. "scrap_date": self.SCRAP_DATE,
  83. "publish_date": self.PUBLISH_DATE,
  84. "summary": self.SUMMARY,
  85. "text": self.TEXT,
  86. "matches": self.MATCHES,
  87. "weight": self.WEIGHT_SUM,
  88. "kw": self.MATCHING_KW,
  89. "html": self.HTML,
  90. "error": self.ERROR,
  91. "deleted": False,
  92. "category": self.CATEGORY,
  93. "title": self.TITLE
  94. }
  95. def fix_title(self,n):
  96. while(html.unescape(n)!=n):
  97. n=html.unescape(n)
  98. n=n.replace("&Dquot",'"')
  99. return n
  100. def dedup(self,val):
  101. return list(set(val))
  102. def isNoise(self,v):
  103. if self.r_noise.match(v):
  104. return True
  105. return False
  106. def isComment(self,v):
  107. if self.r.match(v):
  108. return True
  109. return False
  110. def fix_author(self,a):
  111. return a.replace("_", " ").lower()
  112. def match_keywords(keywords, lowertext):
  113. w_sum=0
  114. matching=[]
  115. matches=False
  116. for k in keywords:
  117. num_matches=len( [ 1 for kwp in k["pattern"] if kwp.search(lowertext) ] )
  118. if num_matches==len(k["pattern"]):
  119. w_sum+=k["weight"]
  120. matching.append(k["kw"])
  121. matches=True
  122. ret=({"matches":matches,"weight":w_sum,"kw":matching})
  123. return ret