Une note lorsque vous grattez un site Web en Python et que vous devez analyser le CSS écrit en ligne dans l'attribut style
de la balise.
Beautiful Soup ne semble pas être capable de gérer le CSS, alors recherchez une bibliothèque qui répond à vos besoins.
J'ai cherché avec PyPI et j'ai décidé d'utiliser cssutils qui apparaissait en haut. La Documentation est écrite correctement, et il semble que le développement se poursuit, donc ça a l'air bien.
Cette fois, je l'ai essayé dans l'environnement de Python 3.3.3. L'installation est un coup avec pip
.
$ python -V
Python 3.3.3
$ pip install cssutils
Cette fois, nous analyserons le CSS en ligne, nous utiliserons donc cssutils.parseStyle
. Il existe différentes interfaces pour l'analyse, et bien que je ne l'ai pas essayé cette fois, il semble que vous puissiez également analyser en spécifiant le nom du fichier ou l'URL. Vous pouvez également spécifier le code de caractère avec un argument facultatif.
>>> from cssutils import parseStyle
>>> style = parseStyle('width: 300px; margin: 0 20px 0 10px;')
>>> type(style)
<class 'cssutils.css.cssstyledeclaration.CSSStyleDeclaration'>
L'analyse du CSS en ligne donne un objet de la classe cssutils.css.CSSStyleDeclaration
. Ce que nous voulons faire cette fois est d'obtenir les valeurs spécifiées par les propriétés width
et margin
à partir d'ici.
Il est facile d'obtenir la valeur d'une propriété sous forme de chaîne.
>>> style.width
'300px'
>>> style.margin
'0 20px 0 10px'
Utilisez les objets des classes cssutils.css.Property
et cssutils.css.PropertyValue
lorsque vous souhaitez analyser un peu plus en détail, par exemple lorsque la valeur est composée de plusieurs éléments ou lorsque vous souhaitez considérer l'unité.
>>> p = style.getProperty('margin')
>>> type(p)
<class 'cssutils.css.property.Property'>
>>> v = p.propertyValue
>>> type(v)
<class 'cssutils.css.value.PropertyValue'>
La classe cssutils.css.PropertyValue
peut gérer individuellement des valeurs constituées de plusieurs éléments.
>>> v.length
4
>>> v[0]
cssutils.css.DimensionValue('0')
>>> v[1]
cssutils.css.DimensionValue('20px')
Chaque élément de la valeur peut être obtenu par une opération de type liste. Cette fois, un objet de la classe cssutils.css.DimensionValue
est renvoyé. Cette classe peut gérer des unités telles que «px» et «em».
>>> v[1].value
20
>>> v[1].dimension
'px'
>>> v[1].cssText
'20px'
Il existe d'autres classes telles que cssutils.css.ColorValue
et cssutils.css.URIValue
, et il semble que l'objet approprié est généré en fonction du format de la valeur.
Recommended Posts