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.