Commits

Anonymous committed b02fb92

FIX: Error when there is multiple valid links to menus. Now it is getting always tha last entry.

Comments (0)

Files changed (2)

 	sesc_unit = {
 	    'pinheiros' : {
 	        'url'     : 'http://www.sescsp.org.br/sesc/busca/index.cfm?unidadesdirector=57#',
-	        'pdf'     : r'<A\s*href\s*=\s*\\"(?P<pdf>.*?cardapio.*?\.pdf)',
+	        'pdf'     : r'(?i).*?card.+?pio.*?',
 	        'years'   : r'^\d{1,2}\s.+\s(\d{2,4})',
 	        'months'  : r'^\d{1,2}\s?(\w+)?\sa\s\d{1,2}\s(\w+)\s\d{2,4}',
 	        'entries' : r'^.?\d\d\s•.+?(?=\n\n)',
 	}
 
 - **url**: Endereço web da unidade;
-- **pdf**: Expressão regular para extrair o endereço para download do PDF da página da unidade. É obrigatória a presença de um grupo chamado ```pdf``` na expressão, do qual será extraído o endereço;
+- **pdf**: Expressão regular para extrair o endereço para download do PDF da página da unidade. Essa expressão será usada para comparar com o conteúdo da tag *a*, caso sejá compatível, será extraído o link dessa tag. Em caso de mais de um resultado, será sempre considerado o último;
 - **years**: Expressão regular para extrair os anos aos quais esse cardápios se aplica;
 - **months**: Expressão regular para extrair os meses aos quais esse cardápios se aplica;
 - **entries**:  Expressão regular para extrair as entradas diárias no cardápio;
 from pdfminer.layout import LAParams
 from cStringIO import StringIO
 from os.path import expanduser, join
+from HTMLParser import HTMLParser
 import re
 import os
 import time
 sesc_unit = {
     'Pinheiros' : {
         'url'     : 'http://www.sescsp.org.br/unidades/unidade-facilidades.action?id=10',
-        'pdf'     : r'<a\s.*?\"(?P<pdf>.*?\.pdf)\".*?card.+?pio.*?<\/a>',
+        'pdf'     : r'(?i).*?card.+?pio.*?',
         'years'   : r'^\d{1,2}\s.+\s(\d{2,4})',
         'months'  : r'^\d{1,2}[^\s]*\s?(\w+)?\sa\s\d{1,2}[^\s]*\s(\w+)\s\d{2,4}',
         'entries' : r'^.?\d\d\s•.+?(?=\n\n)',
 # Thanks to EOL: http://stackoverflow.com/questions/4545661/unicodedecodeerror-when-redirecting-to-file
 sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
 
+class MyHTMLParser(HTMLParser):
+    def __init__ (self, pattern):
+        HTMLParser.__init__(self)
+        self.inside_a = False
+        self.extract = False
+        self.urls = []
+        self.href = None
+        self.match = re.compile(pattern)
+
+    def handle_starttag(self, tag, attrs):
+        if tag == 'a':
+            self.inside_a = True
+            for (name, value) in attrs:
+                if name == 'href':
+                    self.href = value
+
+    def handle_endtag(self, tag):
+        if tag == 'a':
+            if self.inside_a:
+                if self.extract and self.href:
+                    self.urls.append(self.href)
+                self.inside_a = False
+                self.extract = False
+                self.href = None
+
+    def handle_data(self, data):
+        if self.inside_a:
+            if self.match.match(data):
+                self.extract = True
+
+    def get_urls(self, text):
+        self.feed(text)
+        return self.urls
+
 def log(message):
     global quiet
     if not quiet:
     
     Keyword arguments:
     url   -- String of the URL for the web page from where to extract the download link
-    regex -- String of a regular expression to match the downlaod link
+    regex -- String of a regular expression to match the downlaod tag
 
     """
     f = urllib2.urlopen(url)
     s = f.read()
-    m = re.search(regex, s, re.IGNORECASE | re. MULTILINE)
-    pdf_url = m.group('pdf')
+    parser = MyHTMLParser(regex)
+    urls = parser.get_urls(s)
+    if len(urls) == 0:
+        raise Exception('PDF URL not found')
+    pdf_url = urls[-1]
     if pdf_url[0] == '/':
         ps = urlparse(url)
         pdf_url = ps[0]+'://'+ps[1]+pdf_url