2010-05-27 13 views
12

Busco un paquete/módulo/función, etc., que es aproximadamente el equivalente de Python readability.js de Arc90¿Hay algo para Python que sea como readdability.js?

http://lab.arc90.com/experiments/readability

http://lab.arc90.com/experiments/readability/js/readability.js

para que yo pueda darle un poco de input.html y el resultado es una versión limpiada de ese "texto principal de la página html". Quiero esto para poder usarlo en el lado del servidor (a diferencia de la versión JS que se ejecuta solo en el lado del navegador).

¿Alguna idea?

PD: He intentado con Rhino + env.js y esa combinación funciona, pero el rendimiento es inaceptable, lleva unos minutos limpiar la mayor parte del contenido html :((aún no podía encontrar por qué hay una diferencia de rendimiento tan grande)).

Respuesta

0

por qué no tratar de usar Google V8/Node.js en lugar de Rhino? debe ser aceptablemente rápido.

+0

¿Se ejecuta env.js en V8/Node.js para que tenga un entorno similar a un navegador? –

+0

Eso es exactamente lo que hace http://flockfeeds.com/. –

-3

Creo BeautifulSoup es el mejor analizador de HTML para Python. Pero usted todavía tiene que averiguar cuál es el La parte "principal" del sitio es

Si solo está analizando un único dominio, es bastante sencillo, pero f inding un patrón que funciona para cualquier sitio no es tan fácil.

Tal vez usted puede portar el enfoque de readdability.js a python?

1

He hecho algunas investigaciones sobre esto en el pasado y terminé implementando this approach [pdf] en Python. La versión final que implementé también realizó algunas tareas de limpieza antes de aplicar el algoritmo, como eliminar elementos de cabecera/script/iframe, elementos ocultos, etc., pero este era el núcleo de la misma.

Aquí hay una función con una implementación (muy) ingenua del discriminador de "lista de enlaces", que intenta eliminar elementos con una fuerte relación de enlace a texto (es decir, barras de navegación, menús, anuncios, etc.):

def link_list_discriminator(html, min_links=2, ratio=0.5): 
    """Remove blocks with a high link to text ratio. 

    These are typically navigation elements. 

    Based on an algorithm described in: 
     http://www.psl.cs.columbia.edu/crunch/WWWJ.pdf 

    :param html: ElementTree object. 
    :param min_links: Minimum number of links inside an element 
         before considering a block for deletion. 
    :param ratio: Ratio of link text to all text before an element is considered 
        for deletion. 
    """ 
    def collapse(strings): 
     return u''.join(filter(None, (text.strip() for text in strings))) 

    # FIXME: This doesn't account for top-level text... 
    for el in html.xpath('//*'): 
     anchor_text = el.xpath('.//a//text()') 
     anchor_count = len(anchor_text) 
     anchor_text = collapse(anchor_text) 
     text = collapse(el.xpath('.//text()')) 
     anchors = float(len(anchor_text)) 
     all = float(len(text)) 
     if anchor_count > min_links and all and anchors/all > ratio: 
      el.drop_tree() 

En el corpus de prueba que usé, en realidad funcionó bastante bien, pero lograr una alta confiabilidad requerirá muchos ajustes.

4

Acabamos de lanzar una nueva API de procesamiento de lenguaje natural en repustate.com. Usando una API REST, puede limpiar cualquier HTML o PDF y recuperar solo las partes de texto. Nuestra API es gratuita, así que siéntete libre de utilizarla al contenido de tu corazón. Y está implementado en Python. Compruébelo y compare los resultados con la capacidad de lectura.js: creo que encontrará casi el 100% de lo mismo.

+0

¡Hmm, parece prometedor! ;-) Lo probaré. ¿Hay algún límite?¿Cuántas páginas puedo procesar por día, etc.? –

+0

Guau, acabo de utilizar su sitio para ingresar algunas direcciones URL y extrajo los artículos a la perfección. –

3

hn.py a través de Readability's blog. Readable Feeds, una aplicación de App Engine, hace uso de ella.

he liado como un módulo pip-instalable aquí: http://github.com/srid/readability

+1

Esta parece ser una versión muy antigua de legibilidad en comparación con lo que está disponible ahora: 0.4 vs. 1.7.1. ¿Alguna posibilidad de una actualización? –

Cuestiones relacionadas