Конвертировать HTML в обычный текст и поддерживать структуру / форматирование с помощью ruby - PullRequest
5 голосов
/ 20 мая 2011

Я хотел бы преобразовать HTML в обычный текст. Я не хочу просто удалять теги, я бы хотел разумно сохранить как можно больше форматирования. Вставка разрывов строк для тегов <br>, обнаружение абзацев и их форматирование и т. Д.

Ввод довольно простой, обычно хорошо отформатированный html (не целые документы, а просто набор содержимого, обычно без привязок или изображений).

Я мог бы собрать пару регулярных выражений, которые позволили бы мне получить 80%, но я подумал, что могут быть некоторые существующие решения с большим интеллектом.

1 Ответ

8 голосов
/ 20 мая 2011

Во-первых, не пытайтесь использовать регулярные выражения для этого.Шансы действительно хороши, вы найдете хрупкое / хрупкое решение, которое порвет с изменениями в HTML или будет очень сложным в управлении и обслуживании.

Вы можете пройти часть пути очень быстроиспользуя Nokogiri для анализа HTML и извлечения текста:

<code>require 'nokogiri'

html = '
<html>
<body>
  <p>This is
  some text.</p>
  <p>This is some more text.</p>
  <pre>
  This is
  preformatted
  text.
  
'doc = Nokogiri :: HTML (html) помещает doc.text >> Это >> некоторый текст.>> Это еще немного текста.>> >> Это >> предварительно отформатированный >> текст.

Причиной этой работы является то, что Nokogiri возвращает текстовые узлы, которые в основном представляют собой пробелы, окружающие теги, вместе с текстом, содержащимся в тегах.Если вы выполняете предварительную очистку HTML с помощью tidy, иногда вы можете получить намного более приятный вывод.

Проблема заключается в том, что вы сравниваете выходные данные парсера или любые средства просмотра HTMLс тем, что отображает браузер.Браузер заботится о том, чтобы представить HTML как можно более приятным способом, игнорируя тот факт, что HTML может быть ужасно искажен и сломан.Синтаксический анализатор не предназначен для этого.

Вы можете помассировать HTML-код перед извлечением содержимого, чтобы удалить посторонние разрывы строк, такие как "\n" и "\r", а затем заменить теги <br> на строки-брейки.Здесь много вопросов о том, как заменить теги чем-то другим.Я думаю, что сайт Nokogiri также имеет это в качестве одного из учебных пособий.

Если вы действительно хотите сделать это правильно, вам нужно выяснить, что вы хотите сделать для <li> теги внутри тегов <ul> и <ol> вместе с таблицами.

Альтернативный метод атаки - захватить выходные данные одного из текстовых браузеров, таких как lynx.Несколько лет назад мне нужно было выполнить обработку текста для ключевых слов на веб-сайтах, которые не использовали теги мета-ключевых слов, и нашел один из текстовых браузеров, который позволил мне таким образом получать отображаемый результат.У меня нет доступного источника, поэтому я не могу проверить, какой это был.

...