Вопрос по beautifulsoup, css, html, python – BeautifulSoup: получить классы CSS из HTML

4

Есть ли способ получить классы 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'})
]
Что вы ожидаете получить? Буквальный текст"\n\n p.c3 {text-align: justify}\n\n..."? Пожалуйста, будьте явными! Martijn Pieters♦
@Martin Pieters, @ Quentin - обновил вопрос. root
@Quentin - Rulesets да, мой вопрос был поставлен неправильно. Простите за это. Я не уверен, что это (комментарии) - правильное место, чтобы спросить, но есть ли рекомендуемый синтаксический анализатор css для этого? root
По & quot; Получить CSS-классы & quot; Вы имеете в виду & quot; получить список классов HTML, которые используются в селекторах в таблице стилей & quot ;? то есть результат, который вы хотите получить['c3', 'c2', 'c1']? Quentin
Итак, вы хотите наборы правил, а не классы? Вам нужно найти синтаксический анализатор CSS. Я не думаю, что BeautifulSoup имеет какие-либо функции в этом направлении (он может получить таблицу стилей, но не анализировать ее). Quentin

Ваш Ответ

3   ответа
0

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

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

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

0

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 детали опций для фильтрации медиа-правил, комментариев и импорта.

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

6

Сам по себе 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 затем вы можете объединить их, разрешить импорт и даже заставить его извлекать внешние таблицы стилей.

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