Во-первых, не пытайтесь использовать регулярные выражения для этого.Шансы действительно хороши, вы найдете хрупкое / хрупкое решение, которое порвет с изменениями в 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.Несколько лет назад мне нужно было выполнить обработку текста для ключевых слов на веб-сайтах, которые не использовали теги мета-ключевых слов, и нашел один из текстовых браузеров, который позволил мне таким образом получать отображаемый результат.У меня нет доступного источника, поэтому я не могу проверить, какой это был.