Парсер CSS + генератор XHTML, нужен совет - PullRequest
5 голосов
/ 23 апреля 2009

Ребята, мне нужно разработать инструмент, который бы соответствовал следующим требованиям:

  1. Ввод: документ XHTML с правилами CSS в разделе head.
  2. Вывод: документ XHTML с правилами CSS, вычисленными в атрибутах тега

Лучший способ проиллюстрировать поведение, которое я хочу, заключается в следующем.

Пример ввода:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <style type="text/css" media="screen">
    .a { color: red; }
        p { font-size: 12px; }
  </style>
</head>
<body>
    <p class="a">Lorem Ipsum</p>
    <div class="a">
         <p>Oh hai</p>
    </div>
</body>
</html>

Пример вывода:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<body>
    <p style="color: red; font-size: 12px;">Lorem Ipsum</p>
    <div style="color: red;">
         <p style="font-size: 12px;">Oh hai</p>
    </div>
</body>
</html>

Какие инструменты / библиотеки лучше всего подойдут для такой задачи? Я не уверен, что BeautifulSoup и cssutils способны это сделать.

Python не является обязательным требованием. Любые рекомендации будут высоко оценены.

Ответы [ 4 ]

3 голосов
/ 23 апреля 2009

Попробуйте premailer

code.dunae.ca / premailer.web

Дополнительная информация: campaignmonitor.com

1 голос
/ 07 ноября 2009

Существует пакет Python premailer на Pypi

1 голос
/ 23 апреля 2009

Хотя я не знаю какого-либо конкретного инструмента для этого, вот базовый подход, который я бы выбрал:

Загрузить как XML-документ
Извлечение классов и стилей CSS из документа
Для каждой пары класса и стиля CSS
Построить запрос xpath из класса CSS
Для каждого соответствующего узла
Установите атрибут стиля для этого класса
Удалить узел стиля из документа Преобразовать документ в строку

0 голосов
/ 23 апреля 2009

Зависит от того, насколько сложным будет ваш CSS. Если это просто вопрос элементов ("p {}", "a {}"), идентификаторов / классов (#test {}), то, вероятно, проще всего использовать регулярные выражения. Вам понадобится один, чтобы найти все определения стилей и затем проанализировать их, а затем использовать больше регулярных выражений для поиска совпадений тегов.

Например, если вы обнаружили, что у вас есть стиль для тегов A, вы можете использовать регулярное выражение, например:

<a\b[^>]*>(.*?)</a>

Чтобы получить их, вам нужно будет заменить, чтобы добавить стиль. Конечно, вы хотите, чтобы регулярное выражение принимало тег в качестве параметра (в данном случае тег A).

Если вы попали в дочерний отбор или что-то большее, чем просто корневые элементы и ID / классы, это может быстро запутаться.

Подумайте только об определении стилей для начала?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...