[#3020] Moisson de Religec
authorEric Mc Sween <eric.mcsween@auf.org>
Wed, 4 Jul 2012 17:20:19 +0000 (13:20 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Thu, 26 Jul 2012 13:41:48 +0000 (09:41 -0400)
auf_savoirs_en_partage/backend_config.py
auf_savoirs_en_partage/savoirs/lib/harvesters/lodel/html09.py

index ce5f60d..731ee5b 100644 (file)
@@ -6,7 +6,7 @@
 RESOURCES = {
 
     #OAI
-    
+
     u'aide-en-ligne': {
         'type': 'oai',
         'acces': 'generic',
@@ -52,7 +52,8 @@ RESOURCES = {
         'acces': 'generic',
         'url': 'http://revues.temp.bj.refer.org/index.php/BM/',
     },
-    u'Annales des l\'Université de Parakou : Série sciences naturelles et agronomie': {
+    u'Annales des l\'Université de Parakou : '
+    u'Série sciences naturelles et agronomie': {
         'type': 'oai',
         'acces': 'generic',
         'url': 'http://revues.temp.bj.refer.org/index.php/A-UPAR-SNA/',
@@ -119,11 +120,18 @@ RESOURCES = {
         'acces': 'html',
         'url': 'http://www.frantice.net/',
     },
+
+    # Lodel 0.9
     u'FAUN': {
         'type': 'lodel',
         'acces': 'html09',
         'url': 'http://www.bulletin.auf.org/',
-    }
+    },
+    u'Religec': {
+        'type': 'lodel',
+        'acces': 'html09',
+        'url': 'http://www.religec.org/',
+    },
     #'Exchorésis': {
     #    'type': 'lodel',
     #    'acces': 'html',
@@ -132,7 +140,7 @@ RESOURCES = {
 
     # SPIP
     #'Annales des sciences agronomiques du Bénin': {
-    #    'type': 'lodel', 
+    #    'type': 'lodel',
     #    'acces': 'html',
     #    'url': 'http://www.annales-fsa.bj.refer.org/',
     #},
index c3e7fca..714adfa 100644 (file)
@@ -1,8 +1,7 @@
 # encoding: utf-8
 
-from itertools import chain
 from urllib import urlopen
-from urlparse import urljoin
+from urlparse import urlsplit, urlunsplit
 
 from BeautifulSoup import BeautifulSoup
 
@@ -13,7 +12,7 @@ META_MAP = {
     'dc.description': 'description',
     'dc.type': 'type',
     'dc.format': 'format',
-    'dc.identifier': 'uri',
+    'dc.identifier': 'identifier',
     'dc.language': 'language',
     'dc.creator': 'creator',
     'dc.contributor': 'contributor',
@@ -25,20 +24,28 @@ def harvest(options):
     """
     Moisonneur pour les systèmes Lodel 0.9.
     """
+    # Boucle sur toutes les pages du site
+    base_url = urlsplit(options['url'])
+    pending_urls = set([options['url']])
+    seen_urls = set()
+    nodes = {}
+    while pending_urls:
 
-    BASE_URL = options['url']
-
-    def get_soup(path):
-        url = urljoin(BASE_URL, path)
-        f = urlopen(url)
+        # Lecture du contenu de la page
+        current_url = pending_urls.pop()
+        seen_urls.add(current_url)
+        f = urlopen(current_url)
+        if f.info().gettype() != 'text/html':
+            f.close()
+            continue
         html = f.read()
         f.close()
-        return BeautifulSoup(html)
+        soup = BeautifulSoup(html)
+        if not soup.head:
+            continue
 
-    def get_node(path):
-        soup = get_soup(path)
-        uri = urljoin(BASE_URL, path)
-        node = {'identifier': uri, 'uri': uri}
+        # Recherche de métadonnées
+        node = {}
         for meta in soup.head('meta'):
             name = meta.get('name')
             content = meta.get('content')
@@ -48,36 +55,22 @@ def harvest(options):
             if not field:
                 continue
             meta_set(node, field, content)
-        return node
+        if 'identifier' in node and 'title' in node:
+            node['uri'] = node['identifier']
+            nodes[node['identifier']] = node
 
-    index_soup = get_soup('/')
-    auteur_index_uris = (
-        a['href'] for a in chain.from_iterable(
-            ul('a', href=True) for ul in index_soup('ul', 'typepersonne')
-        )
-    )
-    auteur_uris = (
-        a['href'] for a in chain.from_iterable(
-            get_soup(uri)('a', 'auteur', href=True) for uri in auteur_index_uris
-        ) if a.has_key('href')
-    )
-    numero_uris = (
-        a['href'] for a in chain.from_iterable(
-            ul('a', href=True) for ul in index_soup('ul', 'issues')
-        ) if a.has_key('href')
-    )
-    article_uris = set(chain(
-        numero_uris,
-        (a['href'] for a in chain.from_iterable(
-            dl('a', href=True) for dl in chain.from_iterable(
-                get_soup(uri)('dl', 'listArticles') for uri in auteur_uris
-            )
-        ) if a.has_key('href')),
-        (a['href'] for a in chain.from_iterable(
-            ul('a', href=True) for ul in chain.from_iterable(
-                get_soup(uri)('ul', 'summary') for uri in numero_uris
+        # Recherche de liens vers d'autres pages du site
+        new_urls = (
+            urlunsplit((base_url.scheme, base_url.netloc, path, query, ''))
+            for scheme, netloc, path, query, fragment in (
+                urlsplit(a['href'].encode('utf8'))
+                for a in soup('a', href=True)
             )
-        ) if a.has_key('href'))
-    ))
-    nodes = [get_node(uri) for uri in article_uris]
-    return nodes
+            if scheme in ('', base_url.scheme)
+            and netloc in ('', base_url.netloc)
+        )
+        for url in new_urls:
+            if url not in pending_urls and url not in seen_urls:
+                pending_urls.add(url)
+
+    return nodes.values()