Сохранение пространств имен на пользовательских элементах в Nokogiri HTML - PullRequest
1 голос
/ 06 февраля 2011

У меня есть пример HTML, который я пометил некоторыми специальными тегами, которые будут использоваться другой программой, пример HTML ниже. Вы должны отметить элементы <START:organization>..<END>.

<html>
<head/>
<body>
  <ul>
    <li> <START:organization> Advanced Integrated Pest Management <END> </li>
    <li> <START:organization> American Bakers Association <END> </li>
  </ul>
</body>
</html>

Я хотел использовать Nokogiri для предварительной обработки HTML-кода, чтобы легко удалить ненужные теги, такие как <script>. Я создал следующее расширение для класса Документ Nokogiri:

module Nokogiri
  module HTML
    class Document
      def prepare_html
        xpath("//script").remove
        to_html.remove_new_lines
      end
    end
  end
end

Проблема в том, что Nokogiri меняет элемент <START:organization> на <organization>.

Можно ли в любом случае сохранить HTML-код для поддержки пользовательских тегов разметки?

Ответы [ 3 ]

1 голос
/ 06 февраля 2011

Если ваша разметка действительна, вы можете проанализировать ее с помощью синтаксического анализатора XML, а не анализатора HTML.

Редактировать: Просто понял это:

<START:organization>..<END>

Здесь есть пара проблем. Во-первых, начальный и конечный теги не совпадают. Если открывающий тег - '´ then it should be terminated by `. Во-вторых, использование двоеточия в имени узла имеет определенное значение в XML - а именно, что первая часть является пространством имен, а вторая часть - именем узла. В этом случае вам следует либо использовать тег с названием «организация», либо использовать его в атрибуте. Первое, вероятно, имело бы смысл. Итак:

<organization>..</organization>

Если вы не можете изменить это, вы не можете использовать синтаксический анализатор XML / HTML, так как он не является действительным ни XML, ни HTML.

1 голос
/ 06 февраля 2011

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

тем не менее вы можете сделать одно из следующих действий:

  1. взломать Nokogiri, чтобы работать на это кейс
  2. изменить другую программу вы используя (любопытно, что это), чтобы следовать стандартам
  3. написать отдельно парсер для используемого вами DSL
1 голос
/ 06 февраля 2011

В общем, но попробуйте исправить Nokogiri :: XML :: Document и / или использовать to_xml вместо этого - пространства имен недопустимы в HTML, поэтому я предполагаю, что Nokogiri не анализирует / генерирует их.

Конечно, ваши <END> теги также не являются допустимыми XML, поэтому ваш документ недействителен ни в одном из стандартов.

...