Как получить стили любого элемента html из разрешенных таблиц стилей, используя python? - PullRequest
1 голос
/ 29 февраля 2020

У меня есть следующий HTML с примером CSS игрушка.

<html lang="en">
<head>
    <style>
        p {
            font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
        }
        .cl0 {
            background-color: coral;
        }
        .cl1 {
            position: absolute;
            width: auto;
            margin: 0 auto;
        }
        p > span {
            color:cyan;
        }
        #id0::before {
            content: "♥";
        }
        #id1::after {
            content: " \21E6";
        }
        .art0 {
            position: absolute;
            left: 10em;
        }

    </style>
</head>
<body>
    <div class="cl1">
        <p class="cl0">
            Story <span id="id0">Numbawan</span>
        </p>
        <article class="art0">
            Story <span id="id1">Numbatu</span>
        </article>
    </div>
</body>
</html>

Браузер может обрабатывать и применять стили CSS к любому элементу. Но есть ли способ (библиотека) сделать то же самое в python и вывести что-то вроде BeautifulSoup, но с каждым элементом, имеющим свойство , которое будет содержать решенный полный стиль ?

for span in soup.find_all('span'):
    print(span.string,'--', span.style)
=====================
Numbawan--content: "♥";background-color: coral;font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;color:cyan;
Numbatu--content: " \21E6";position: absolute;left: 10em;

И я имею в виду не только для приведенного выше примера, что я, вероятно, могу жестко программировать, но и для любых сложных стилей с многочисленными таблицами стилей современной веб-страницы? Я знаю, что есть селен, который под капотом отображает страницу с хромом, но позволяет ли он видеть КАЖДЫЙ стиль элементов, как я описал? Буду признателен за любые советы, как к нему подойти.

1 Ответ

0 голосов
/ 02 марта 2020
from bs4 import BeautifulSoup as bs
import cssutils                                 

with open("index.html") as f:
    content = f.read()
    soup = bs(content, 'html.parser')

css_text = soup.find('style').text
sheets = list(cssutils.parseString(cssText=css_text))
css = dict()
for sheet in sheets:
    css[sheet.selectorText] = sheet.style.cssText

for span in soup.findAll("span"):
    for key in css.keys():
        if span["id"] in key:
            print(span.text, css[key])
            break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...