| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #!/usr/bin/python3
- import sys
- import re
- import newspaper
- import pymongo
- import htmlmin
- import feedparser
- from frontpage import FrontPage
- from newspaper import Article
- from db import db
- from source import Source
- class LinkList():
- def __init__(self,url,selector=None,rss=False):
- self.links=[]
- if rss:
- feed = feedparser.parse(url)
- #print(feed["bozo"]) FIXME: If bozo==1 => error
- self.links=[i["link"] for i in feed["items"]]
- else:
- if selector is None:
- #s=newspaper.build(url,language="en",memoize_articles=False) #memoize puede salvarme la vida
- s = newspaper.Source(url,memoize_articles=False)
- s.download()
- s.parse()
- s.set_categories()
- s.download_categories()
- s.parse_categories()
- s.generate_articles()
-
- self.links=list(set([a.url for a in s.articles])) #avoid dupes
- else:
- f=FrontPage(url,selector)
- self.links=f.links
- self.links=self.purgeLinks(self.links)
- def purgeLinks(self,l):
- return [ sanitizeUrl(link) for link in l if not "presslist" in link.lower() and not "videolist" in link.lower() ]
- 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)
- def __init__(self,url,lang="en"):
- url=sanitizeUrl(url)
- a = Article(url, language=lang,keep_article_html=True)
- a.download()
- a.parse()
- a.nlp()
-
- a.authors=self.dedup([self.fix_author(value) for value in a.authors if not self.isComment(value) and not self.isNoise(value)])
-
- print(a.authors)
- print(a.publish_date)
- print(a.summary)
- print(a.keywords)
- #print(a.text) #FIXME
- print(a.top_image)
- print(a.movies)
- print(htmlmin.minify(a.article_html,remove_empty_space=True))
- 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()
- l=None
- #d=db()
- #l=LinkList("http://9to5google.com")
- #l=LinkList("http://www.alibabagroup.com/en/news/press")
- #l=LinkList("http://phx.corporate-ir.net/phoenix.zhtml?c=176060&p=irol-news", selector=".ccbnTblLnk")
- #l=LinkList("http://about.americanexpress.com/news/pr/releases.aspx")
- #NOT WORKING l=LinkList("http://www.americanbanker.com/")
- #l=LinkList("http://officialandroid.blogspot.com/atom.xml",rss=True)
- #l=LinkList("https://www.apple.com/pr/feeds/pr.rss",rss=True)
- #l=LinkList("http://appleinsider.com/rss/news/",rss=True)
- #l=LinkList("http://newsroom.bankofamerica.com/feeds/press_release/all/rss.xml",rss=True)
- #l=LinkList("https://newsroom.fb.com/feed/",rss=True)
- #n=News("http://appleinsider.com/articles/16/05/11/apple-again-rumored-to-turn-la-landmark-into-retail-store")
- #n=News("http://9to5google.com/2016/05/11/nest-opensource-openthread-networking-protocol/?share=google-plus-1")
- #n=News("http://www.alibabagroup.com/en/news/article?news=p150908b")
- #n=News("http://phx.corporate-ir.net/phoenix.zhtml?c=176060&p=irol-newsArticle&ID=1250170")
- #n=News("http://about.americanexpress.com/news/pr/2016/amex-dividend-payable-august-10-2016.aspx")
- #n=News("http://www.apple.com/pr/library/2015/06/08Apple-Pay-Giving-Shoppers-Even-More-Ways-to-Pay.html")
- #n=News("http://newsroom.bankofamerica.com/press-releases/small-business-banking/bank-america-survey-finds-small-business-owners-confidence-dow")
- #n=News("http://newsroom.fb.com/news/2016/04/news-feed-fyi-more-articles-you-want-to-spend-time-viewing/")
- #l=LinkList("https://www.blogger.com/feeds/10861780/posts/default",rss=True)
- #n=News("http://googleblog.blogspot.com/2016/05/translate-where-you-need-it-in-any-app.html") #FIXME
- #l=LinkList("https://apps.shareholder.com/rss/rss.aspx?channels=14&companyid=ONE",rss=True)
- #n=News("http://investor.shareholder.com/jpmorganchase/press/releasedetail.cfm?ReleaseID=970074")
- #l=LinkList("http://www.samsungmobilepress.com/press/pressList.asp")
- #n=News("http://www.samsungmobilepress.com/press/Samsungs-Connected-Ecosystem-Accelerates-the-Growth-of-the-Gear-S2-Applications?2016-03-22")
- #l=LinkList("https://news.starbucks.com/feeds/news")
- #l=LinkList("http://www.techinsider.io/rss",rss=True)
- #l=LinkList("https://newsroom.uber.com/feed/", rss=True)
- #if l is not None:
- # for a in l.links:
- # print(a)
- # print(len(l.links))
- # n=News(l.links[0])
- #
- #sys.exit(1)
- unsharer=re.compile(r"\?share=.+$",flags=re.IGNORECASE)
- def sanitizeUrl(url):
- global unsharer
- return re.sub(unsharer, "",url)
- #return url.replace("?share=google-plus-1","").replace("?share=facebook","")
- def sanitizeSelector(s):
- s=s.replace(">a","> a")
- if re.match(r'=\w+\]',s) is None:
- return s
- print(s)
- ret=re.sub(r"=(\w+)]", r'="\1"]', s)
- print(ret)
- return ret
- d=db()
- for s in d.sources():
- print(s["name"])
- sel=None
- rss=False
- if "selector" in s:
- sel=s["selector"]
- if "rss" in s:
- rss=bool(["rss"])
- l=LinkList(s["link"],sel,rss=rss)
- if l is not None:
- for a in l.links:
- print(a)
- print(len(l.links))
- n=News(l.links[0])
- break
|