css - 是否可以使用 Nokogiri 解析样式表?

标签 css ruby nokogiri css-parsing

我已经用谷歌搜索了两个小时,但找不到任何好的答案,所以让我们看看人类是否能打败谷歌计算机。

我想在 Ruby 中解析样式表,以便我可以将这些样式应用到文档中的元素(使样式内联)。所以,我想采取类似的措施

<style>
.mystyle {
  color:white;
}
</style>

并且能够将其提取到某种 Nokogiri 对象中。

Nokogiri 类“CSS::Parser”(http://nokogiri.rubyforge.org/nokogiri/Nokogiri/CSS/Parser.html)当然有一个很有前途的名字,但我找不到任何关于它是什么或它如何工作的文档,所以我不知道它是否能做什么我在这儿。

我的最终目标是能够编写如下代码:

a_web_page = Nokogiri::HTML(html_page_as_string)
parsed_styles = Nokogiri::CSS.parse(html_page_as_string)
parsed_styles.each do |style| 
  existing_inlined_style = a_web_page.css(style.declaration) || ''
  a_web_page.css(style.declaration)['css'] = existing_inlined_style + style.definition
end

将从样式表中提取样式并将它们全部作为内联样式添加到我的文档中。

最佳答案

Nokogiri 无法解析 CSS 样式表。

您遇到的 CSS::Parser 解析 CSS 表达式。每当您通过 CSS 选择器而不是 XPath 遍历 HTML 树时都会使用它(这是 Nokogiri 的 cool feature)。

有一个 ruby CSS parser , 尽管。您可以将它与 Nokogiri 一起使用来实现您想要的。

require "nokogiri"
require "css_parser"

html = Nokogiri::HTML(html_string)

css = CssParser::Parser.new
css.add_block!(css_string)

css.each_selector do |selector, declarations, specificity|
  html.css(selector).each do |element|
    style = element.attributes["style"]&.value || ""
    element.set_attribute('style', [style, declarations].compact.join(" "))
  end
end

关于css - 是否可以使用 Nokogiri 解析样式表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2940472/

相关文章:

javascript - 在随机位置创建 div

javascript - 这个 JSON 字符串有什么问题?使用 Rails 和 ActiveSupport 解码

html - 使用 Ruby 从 HTML 文档中剥离文本

ruby-on-rails - Nokogiri 未能构建 gem native 扩展(RuntimeError)?

选择中的 html css 3 点截断选项

css - JavaFX Canvas 元素 ID(通过 CSS 为 Canvas 元素设置样式)

html - 打开时更改 HTML 选择菜单的背景图像

ruby - 为什么?无法转换成字符串 : I do have a to_s method!

ruby-on-rails - 目录 : How to show/print data from other model on a table?

ruby-on-rails - github-pages 的 bundle 更新失败