Nokogiri CSS规范化

Nokogiri CSS规范化,css,ruby,nokogiri,Css,Ruby,Nokogiri,我有一些属性,比如: <span style="font:22px Arial">...</span> 。。。 还有一些人喜欢: <span style="font-size:22px;font-family:Arial">...</span> 。。。 现在,我可以使用nokogiri获得style属性,但我需要的是以下信息: 字体系列 字号 颜色 文字装饰 字重 字体样式 一些属性,如颜色,很容易获得,但另一些属性,如字体大小,需要对

我有一些属性,比如:

<span style="font:22px Arial">...</span>
。。。
还有一些人喜欢:

<span style="font-size:22px;font-family:Arial">...</span>
。。。
现在,我可以使用nokogiri获得style属性,但我需要的是以下信息:

  • 字体系列
  • 字号
  • 颜色
  • 文字装饰
  • 字重
  • 字体样式
一些属性,如颜色,很容易获得,但另一些属性,如字体大小,需要对css字符串进行相当多的修改


在深入研究我自己的解决方案之前,我想知道nokogiri,或者一个专门的css gem是否能够规范化css字符串,并让我逐个查询css属性。如果我能得到计算出的css(例如,当我要求子元素的字体大小时,字体大小为10的元素中没有字体大小的元素会给我10),那么会更方便,但最后一部分很容易通过哈希和堆栈实现,所以这并不重要。

嗯。JavaScript DOM解析器可以很好地完成这项工作,但我不知道Ruby是否可以。这可能是一个起点,但我不知道它是否可以处理内联样式


当然,像这样的内联样式是邪恶的,部分原因是它们很难正常化。如果这是您自己的标记,请尽快替换为样式表。

不,Nokogiri没有这样的功能来执行此操作。您希望在Ruby中实现JavaScript的等价物,这需要一个Ruby库,它知道如何解析HTML和CSS,并将CSS规则应用于HTML文档


编辑:您可以尝试将JRuby与一起用于无头web浏览器。

在尝试了许多不同的方法后,我从零开始编写了自己的解决方案

以下是我是如何做到这一点的,以供将来参考:

  • 使用Nokogiri的
    文档遍历
    遍历文档
  • 每次遇到文本节点时,我都会执行类似于
    parents=[];parent=node.parent;而parent do parents}
  • 最后,对于结果数组中的每个文本块,我循环父节点并手动分析每个节点,逐个设置样式,例如,字体大小:

        css = node[:style]
        if not style[:font_size] # style is a hash applied to each text chunk, the first encountered parent that define it wins
            if node.name == 'font' and node[:size]
                style[:font_size] = node[:size].to_i * 5
            elsif css =~ /font-size:[^;\d]*(\d*)/
                style[:font_size] = $1.to_i
            elsif css =~ /font:[^;\d]*(\d*)/
                style[:font_size] = $1.to_i
            end
        end
    

处理所有的浏览器案例并不难,它只是采用了一种系统的方法。字体大小的最终实现大约要长5倍(处理单位…)。不幸的是,我无法发布完整的源代码。但我希望它能为那些使用它的人回答这个问题。

我同意用样式表替换是最好的主意。在这种情况下,Nokogiri可以很好地提取当前定义的样式,并重写文件以从tags.Right中删除
style
参数。或者更确切地说,可能不是Nokogiri,而是任何你最终使用的CSS解析器。实际上……如果这是一次性的(或者至少,如果它不需要集成到你的Ruby应用程序中),你最好用JavaScript或CoffeeScript(或HotRuby!)编写它并在浏览器中运行,这样您就可以访问
getComputedStyle
。这样做的目的是避免无头浏览器。html是由我们无法控制的WYSIWYG编辑器生成的。明白,但在这种情况下,浏览器引擎可能是最好的解决方案,因为您需要CSS解析。嗯。就这一点而言,您的用例是什么样的?您无法控制HTML,但需要对其进行规范化?