PyAr / CDPedia

CDPedia is a project to make the Wikipedia accesable offline
34 stars 15 forks source link

OmitRedirects preprocessor sometimes crashes. #345

Closed facundobatista closed 3 years ago

facundobatista commented 3 years ago

This happened:

2020-12-17 15:11:38,815  src.preprocessing.preprocess ERROR    Processor <src.preprocessing.preprocessors.OmitRedirects object at 0x7fd1618b0190> crashed on page 'Filosofia_Oriental_de_la_Respiracion'
Traceback (most recent call last):
  File "cdpetron.py", line 447, in <module>
    main(
  File "cdpetron.py", line 351, in main
    generate.main(
  File "/home/facundo/cdpedia/CDPedia/src/generate.py", line 321, in main
    preprocess.run(articulos)
  File "/home/facundo/cdpedia/CDPedia/src/preprocessing/preprocess.py", line 321, in run
    wikisite.process()
  File "/home/facundo/cdpedia/CDPedia/src/preprocessing/preprocess.py", line 152, in process
    (this_score, other_scores) = processor(wikipage)
  File "/home/facundo/cdpedia/CDPedia/src/preprocessing/preprocessors.py", line 208, in __call__
    url_redirect = node.find('a').attrs['href']
AttributeError: 'NoneType' object has no attribute 'attrs'

This is a quick hack I did to continue:

diff --git a/src/preprocessing/preprocessors.py b/src/preprocessing/preprocessors.py
index 1a3f93f..81dca71 100644
--- a/src/preprocessing/preprocessors.py
+++ b/src/preprocessing/preprocessors.py
@@ -205,7 +205,12 @@ class OmitRedirects(_Processor):
         # store the redirect in corresponding file
         self.stats['redirect'] += 1
         # extract target from href not from text
-        url_redirect = node.find('a').attrs['href']
+        redirect_node = node.find('a')
+        if redirect_node is None:
+            self.stats['simplefile'] += 1
+            return (0, [])
+
+        url_redirect = redirect_node.attrs['href']
         # remove path prefix
         if url_redirect.startswith(PAGES_PREFIX):
             url_redirect = url_redirect[len(PAGES_PREFIX):]
fzuccolo commented 3 years ago

Issue de difícil reproducción ya que la página Filosofia_Oriental_de_la_Respiracion no existe en wikipedia.

Lo que sucede es que pueden existir páginas de redirección que apuntan a artículos no existentes. Wikipedia mantiene una lista de estas redirecciones rotas (que periodicamente se eliminan o corrigen) acá: https://es.wikipedia.org/w/index.php?title=Especial:RedireccionesRotas

Un enlace a un artículo que no existe es un redlink. Al procesar los artículos (incluídos los redirects), el preprocesador HTMLCleaner remueve los redlinks del HTML pero mantiene el texto (como corresponde). Luego en estos casos el preprocesador OmitRedirect detecta el redirect, encuentra el nodo con el texto pero no el enlace esperado, por lo tanto falla.