2011-05-20 20 views
5

Me gustaría convertir html a texto sin formato. No obstante, no quiero desnudar las etiquetas, me gustaría conservar inteligentemente todo el formato posible. Insertar saltos de línea para etiquetas <br>, detectar párrafos y formatearlos como tales, etc.Convertir HTML a texto sin formato y mantener la estructura/formato, con ruby ​​

La entrada es bastante simple, generalmente html bien formateado (no documentos completos, solo un montón de contenido, generalmente sin anclajes o imágenes) .

Pude juntar un par de expresiones regulares que me dieron el 80% pero pensé que podría haber algunas soluciones existentes con más inteligencia.

Respuesta

7

Primero, no intente usar regex para esto. Las probabilidades son realmente buenas, se obtendrá una solución frágil/frágil que se romperá con los cambios en el HTML o será muy difícil de administrar y mantener.

Usted puede obtener una parte del camino hay muy rápidamente usando Nokogiri para analizar el código HTML y extraer el texto:

require 'nokogiri' 

html = ' 
<html> 
<body> 
    <p>This is 
    some text.</p> 
    <p>This is some more text.</p> 
    <pre> 
    This is 
    preformatted 
    text. 
    </pre> 
</body> 
</html> 
' 

doc = Nokogiri::HTML(html) 
puts doc.text 

>> This is 
>> some text. 
>> This is some more text. 
>> 
>> This is 
>> preformatted 
>> text. 

La razón por la que esto funciona es Nokogiri está devolviendo los nodos de texto, que son básicamente los espacios en blanco que rodea las etiquetas, junto con el texto contenido en las etiquetas. Si realiza una limpieza previa al vuelo del HTML utilizando tidy, a veces puede obtener un resultado mucho mejor.

El problema es cuando se compara la salida de un analizador, o cualquier medio de ver el HTML, con lo que muestra un navegador. El navegador se preocupa de presentar el HTML de la manera más agradable posible, ignorando el hecho de que el HTML puede estar terriblemente mal formado y roto. El analizador no está diseñado para hacer eso.

Puede realizar un masaje en el código HTML antes de extraer el contenido para eliminar saltos de línea extraños, como "\n" y "\r", seguido de la sustitución de <br> etiquetas con saltos de línea. Aquí hay muchas preguntas sobre SO que explican cómo reemplazar etiquetas con otra cosa. Creo que el Nokogiri site también lo tiene como uno de los tutoriales.

Si realmente quiere hacerlo bien, necesitará averiguar qué quiere hacer para las etiquetas <li> dentro de las etiquetas <ul> y <ol>, junto con las tablas.

Un método de ataque alternativo sería capturar el resultado de uno de los buscadores de texto como lynx. Hace varios años tuve que hacer el procesamiento de texto para palabras clave en sitios web que no usaban etiquetas de Meta-Palabra clave, y encontré uno de los navegadores de texto que me permiten tomar el resultado representado de esa manera. No tengo la fuente disponible, así que no puedo verificar para ver cuál era.

Cuestiones relacionadas