Действительно ли возможно проанализировать таблицу стилей с Nokogiri?

Я провел свои необходимые два часа, гугля это, и я не могу найти хорошие ответы, поэтому давайте посмотрим, могут ли люди победить компьютеры Google.

Я хочу проанализировать таблицу стилей в Ruby так, чтобы я мог применить те стили к элементам в моем документе (для создания стилей встроенными). Так, я хочу взять что-то как


И смогите извлечь его в какой-то объект Nokogiri.

Класс Nokogiri "CSS:: Синтаксический анализатор" (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

Который извлек бы стили из таблицы стилей и добавил бы их всех как встроенные стили к моему документу.

9
задан molf 30 May 2010 в 21:57
поделиться

2 ответа

У @molf определенно был отличный старт, но все же потребовалось отладить несколько проблем, чтобы заставить его работать в продакшене. Вот текущая протестированная версия этого:

html = Nokogiri::HTML(html_string)
css = CssParser::Parser.new
css.add_block!(html_string) # Warning:  This line modifies the string passed into it.  In potentially bad ways.  Make sure the string has been duped and stored elsewhere before passing this.

css.each_selector do |selector, declarations, specificity|
  next unless selector =~ /^[\d\w\s\#\.\-]*$/ # Some of the selectors given by css_parser aren't actually selectors.
  begin
    elements = html.css(selector)
    elements.each do |match|
      match["style"] = [match["style"], declarations].compact.join(" ")
    end
  rescue
    logger.info("Couldn't parse selector '#{selector}'")
  end
end

html_with_inline_styles = html.to_s 
3
ответ дан 4 December 2019 в 11:40
поделиться

Nokogiri не может анализировать таблицы стилей CSS.

CSS :: Parser , с которым вы столкнулись, анализирует выражения CSS . Он используется всякий раз, когда вы перемещаетесь по дереву HTML с помощью селекторов CSS, а не XPath (это классная функция Nokogiri).

Тем не менее, существует парсер CSS Ruby . Вы можете использовать его вместе с 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|
  element = html.css(selector)
  element["style"] = [element["style"], declarations].compact.join(" ")
end
15
ответ дан 4 December 2019 в 11:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: