【问题标题】:Nokogiri CSS normalizationNokogiri CSS normalization
【发布时间】:2011-12-28 19:21:27
【问题描述】:

我有一些属性,例如:

<span style="font:22px Arial">...</span>

还有其他类似的:

<span style="font-size:22px;font-family:Arial">...</span>

现在我可以使用 nokogiri 获取样式属性,但我想要的是以下信息:

  • 字体系列
  • 字体大小
  • 颜色
  • 文字装饰
  • 字体粗细
  • 字体样式

像颜色这样的一些属性很容易获得,但像字体大小这样的其他一些属性需要对 css 字符串进行一些修改。

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

【问题讨论】:

    标签: css ruby nokogiri


    【解决方案1】:

    嗯。 JavaScript DOM 解析器可以很好地做到这一点,但我不知道 Ruby 是否可以。 css_parser gem 可能是一个起点,但我不知道它是否可以处理内联样式...

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

    【讨论】:

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

    不,Nokogiri 没有执行此操作的能力。您希望在 Ruby 中实现 JavaScript 的 getComputedStyle() 等效项,这需要一个知道如何解析 HTML 和 CSS 并将 CSS 规则应用于 HTML 文档的 Ruby 库。

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

    【讨论】:

      【解决方案3】:

      在尝试了很多不同的事情之后,我结束了从头开始编写自己的解决方案。

      为了将来参考,我是这样做的:

      • 使用 Nokogiri 的doc.traverse 遍历文档
      • 每次遇到文本节点时,我都会执行parents = []; parent = node.parent; while parent do parents &lt;&lt; parent; parent = parent.parent; end; result &lt;&lt; {:text =&gt; node.text, :parents =&gt; 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
        

      处理所有浏览器案例并不难,它只是采取了一种系统化的方法。 font-size 的最终实现大约长 5 倍(处理单位......)。不幸的是,我无法发布完整的源代码。但我希望它能回答那些登陆它的人的问题。

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 2014-03-18
        • 2012-07-30
        • 2010-12-27
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 2019-06-14
        相关资源
        最近更新 更多