Ein Hinweis, wenn Sie eine Website in Python scrappen und das CSS analysieren müssen, das inline im Attribut "style" des Tags geschrieben wurde.
Beautiful Soup scheint nicht in der Lage zu sein, mit CSS umzugehen. Suchen Sie daher nach einer Bibliothek, die Ihren Anforderungen entspricht.
Ich habe mit PyPI gesucht und mich für cssutils entschieden, das oben angezeigt wird. Dokumentation ist richtig geschrieben und es scheint, dass die Entwicklung fortgesetzt wird, also sieht es gut aus.
Diesmal habe ich es in der Umgebung von Python 3.3.3 versucht. Die Installation ist ein Schuss mit "pip".
$ python -V
Python 3.3.3
$ pip install cssutils
Dieses Mal werden wir Inline-CSS analysieren, also werden wir "cssutils.parseStyle" verwenden. Es gibt verschiedene Schnittstellen zum Parsen, und obwohl ich es diesmal nicht ausprobiert habe, können Sie es anscheinend auch analysieren, indem Sie den Dateinamen und die URL angeben. Sie können den Zeichencode auch mit einem optionalen Argument angeben.
>>> from cssutils import parseStyle
>>> style = parseStyle('width: 300px; margin: 0 20px 0 10px;')
>>> type(style)
<class 'cssutils.css.cssstyledeclaration.CSSStyleDeclaration'>
Das Parsen von Inline-CSS ergibt ein Objekt der Klasse "cssutils.css.CSSStyleDeclaration". Was wir diesmal tun möchten, ist, die Werte, die durch die Eigenschaften "width" und "margin" angegeben sind, von hier abzurufen.
Es ist einfach, den Wert einer Eigenschaft als Zeichenfolge abzurufen.
>>> style.width
'300px'
>>> style.margin
'0 20px 0 10px'
Verwenden Sie die Objekte der Klassen cssutils.css.Property
und cssutils.css.PropertyValue
, wenn Sie etwas detaillierter analysieren möchten, z. B. wenn der Wert aus mehreren Elementen besteht oder wenn Sie die Einheit berücksichtigen möchten.
>>> p = style.getProperty('margin')
>>> type(p)
<class 'cssutils.css.property.Property'>
>>> v = p.propertyValue
>>> type(v)
<class 'cssutils.css.value.PropertyValue'>
Die Klasse "cssutils.css.PropertyValue" kann Werte, die aus mehreren Elementen bestehen, einzeln verarbeiten.
>>> v.length
4
>>> v[0]
cssutils.css.DimensionValue('0')
>>> v[1]
cssutils.css.DimensionValue('20px')
Jedes Element des Wertes kann durch eine listenartige Operation erhalten werden. Dieses Mal wird ein Objekt der Klasse cssutils.css.DimensionValue
zurückgegeben. Diese Klasse kann Einheiten wie "px" und "em" verarbeiten.
>>> v[1].value
20
>>> v[1].dimension
'px'
>>> v[1].cssText
'20px'
Es gibt andere Klassen wie "cssutils.css.ColorValue" und "cssutils.css.URIValue", und es scheint, dass das entsprechende Objekt abhängig vom Wertformat generiert wird.
Recommended Posts