在Nokogiri HTML中保留自定义元素的名称空间

时间:2011-02-06 07:22:45

标签: ruby nokogiri

我有一些示例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 Document类创建了以下扩展:

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 个答案:

答案 0 :(得分:1)

远景,但尝试修补Nokogiri :: XML :: Document和/或使用to_xml - 名称空间在HTML中无效,所以我猜Nokogiri不会解析/生成它们。

当然,您的<END>标记也不是有效的XML,因此您的文档在任何一种标准中都无效。

答案 1 :(得分:1)

如果您的标记有效,您可以使用XML解析器而不是HTML解析器来解析它。

编辑:刚刚意识到这一点:

<START:organization>..<END>

这里有几个问题。首先,开始和结束标记不匹配。如果开始标记是'then it should be terminated by`。其次,在节点名称中使用冒号在XML中具有一定的含义 - 即第一部分是命名空间而第二部分是节点名称。在这种情况下,您应该使用名为“organization”的标记,或者将其包含在属性中。第一个可能是最有意义的。所以:

<organization>..</organization>

如果你不能改变它,那么就不能使用XML / HTML解析器,因为它不是有效的XML也不是HTML。

答案 2 :(得分:1)

像其他两个人所说的那样,如果你的输入不是标准的XML,也不是HTML,你真的不希望设计一个解析器来工作。

然而,您可以执行以下操作之一:

  1. 攻击Nokogiri为此工作 案例
  2. 改变你的其他节目 使用(好奇它是什么)来 遵循标准
  3. 单独写 您正在使用的DSL的解析器