]> gitweb.pimeys.fr Git - dtc.git/blob - fetch_dtc.py
Affichage de l'erreur aussi + échec de %s
[dtc.git] / fetch_dtc.py
1 #!/usr/bin/env python
2 # -*- encoding: utf-8 -*-
3
4 """Pour récupérer les quotes DTC à partir du flux RSS"""
5
6 import BeautifulSoup
7 import feedparser
8 import re
9
10 import html2text
11
12 #: Regexp permettant de matcher l'id d'une quote et de virer le garbage qui traîne en bas
13 endquote_regexp = ur"\n\[#(\d+)\]\(http://danstonchat.com/\1\) - \[Voir les.commentaires\]\(http://danstonchat.com/\1#c\)"
14 endreg = re.compile(endquote_regexp, flags=re.DOTALL)
15
16 def properquote(quote):
17 """Prend la quote tirée RSS et la renvoie dans un format lisible."""
18 quote = str(quote).decode("utf-8")
19 quote = html2text.html2text(quote)
20 # Ce truc génère bêtement des lignes vides
21 quote = quote.replace(u"\n\n", u"\n")
22 return quote
23
24 def parsequote(quote):
25 """Parse la quote. Renvoie ``(<id>, <quote nettoyée>)`` ou ``None`` si il n'y a pas d'id.
26 (C'est-à-dire, si ce n'est en fait pas une quote)
27 Renvoie aussi ``None`` sur un commentaire ``"_(A propos de)_"``"""
28 ids = endreg.findall(quote)
29 if quote.startswith(u"_(A propos de)_"):
30 return None
31 if ids:
32 return {"id" : int(ids[0]), "quote" : endreg.sub("", quote)}
33 else:
34 return None
35
36 def getquotes():
37 """Récupère toutes les quotes, avec date de publication et id."""
38 flux = feedparser.parse("http://danstonchat.com/rss.xml")
39 allquotes = []
40 for entry in flux["entries"]:
41 content = entry["summary"]
42 soup = BeautifulSoup.BeautifulSoup(content)
43 quotes = soup.findChildren(name="p")
44 quotes = [properquote(q) for q in quotes]
45 # Attention, en vrai il n'y a pas que des quotes là-dedans,
46 # mais aussi des top comments et autre random shit
47 # donc on vire les None
48 quotes = [parsequote(q) for q in quotes]
49 quotes = [q for q in quotes if not q is None]
50 [q.update({"date": entry["published"]}) for q in quotes]
51 allquotes.extend(quotes)
52 return allquotes