BeautifulSoup: получить классы CSS из HTML

Есть ли способ получить классы CSS из файла HTML, используя BeautifulSoup? Пример фрагмента:

<style type="text/css">

 p.c3 {text-align: justify}

 p.c2 {text-align: left}

 p.c1 {text-align: center}

</style>

Идеальный результат будет:

cssdict = {
    'p.c3': {'text-align':'justify'},
    'p.c2': {'text-align:'left'},
    'p.c1':{'text-align':'center'}
}

хотя что-то вроде этого подойдет

L = [
    ('p.c3', {'text-align': 'justify'}),  
    ('p.c2', {'text-align': 'left'}),    
    ('p.c'1, {'text-align': 'center'})
]
 Martijn Pieters♦16 июл. 2012 г., 11:15
Что вы ожидаете получить? Буквальный текст"\n\n p.c3 {text-align: justify}\n\n..."? Пожалуйста, будьте явными!
 root16 июл. 2012 г., 11:23
@Martin Pieters, @ Quentin - обновил вопрос.
 root16 июл. 2012 г., 11:28
@Quentin - Rulesets да, мой вопрос был поставлен неправильно. Простите за это. Я не уверен, что это (комментарии) - правильное место, чтобы спросить, но есть ли рекомендуемый синтаксический анализатор css для этого?
 Quentin16 июл. 2012 г., 11:15
По & quot; Получить CSS-классы & quot; Вы имеете в виду & quot; получить список классов HTML, которые используются в селекторах в таблице стилей & quot ;? то есть результат, который вы хотите получить['c3', 'c2', 'c1']?
 Quentin16 июл. 2012 г., 11:24
Итак, вы хотите наборы правил, а не классы? Вам нужно найти синтаксический анализатор CSS. Я не думаю, что BeautifulSoup имеет какие-либо функции в этом направлении (он может получить таблицу стилей, но не анализировать ее).

Ответы на вопрос(3)

Синтаксический анализатор tinycss существует для явного анализа CSS в python. BeautifulSoup поддерживает HTML-теги, и определенные классы CSS не могут быть найдены, если вы не используете регулярное выражение. Это даже поддерживает некоторое количество CSS3.

http://packages.python.org/tinycss/

PS: Тем не менее, он работает только с Python 2.6 и выше.

A BeautifulSoup & amp; cssutils combo отлично справится с задачей:

    from bs4 import BeautifulSoup as BSoup
    import cssutils
    selectors = {}
    with open(htmlfile) as webpage:
        html = webpage.read()
        soup = BSoup(html, 'html.parser')
    for styles in soup.select('style'):
        css = cssutils.parseString(styles.encode_contents())
        for rule in css:
            if rule.type == rule.STYLE_RULE:
                style = rule.selectorText
                selectors[style] = {}
                for item in rule.style:
                    propertyname = item.name
                    value = item.value
                    selectors[style][propertyname] = value

BeautifulSoup анализирует все «стили» теги в html (head & amp; body), .encode_contents () преобразуют объекты BeautifulSoup в байтовый формат, который может прочитать cssutils, а затем cssutils анализирует отдельные стили CSS вплоть до уровня свойства / значения через rule.selectorText & амп; rule.style.

Note: & Quot; rule.STYLE_RULE & quot; отфильтровывает только стили.документация cssutils детали опций для фильтрации медиа-правил, комментариев и импорта.

Было бы чище, если бы вы разбили это на функции, но вы получили суть ...

Решение Вопроса

Сам по себе BeautifulSoup не разбирает объявления стилей CSS, но выcan распакуйте такие разделы, а затем проанализируйте их с помощью специального синтаксического анализатора CSS.

В зависимости от ваших потребностей, для Python доступно несколько парсеров CSS; Я выбираюcssutils (требуется python 2.5 или более поздняя версия (включая python 3)), он является наиболее полным в его поддержке и также поддерживает встроенные стили.

Другие вариантыCSS-ру а такжеtinycss.

Чтобы получить и проанализировать все разделы стиля (например, cssutils):

import cssutils
sheets = []
for styletag in tree.findAll('style', type='text/css')
    if not styletag.string: # probably an external sheet
        continue
    sheets.append(cssutils.parseStyle(styletag.string))

Сcssutil затем вы можете объединить их, разрешить импорт и даже заставить его извлекать внешние таблицы стилей.

Ваш ответ на вопрос