python - fuente - Encuentra todos los estilos de compás con un tamaño de letra más grande que el más común a través de la sopa hermosa pitón
que es tamaño de fuente (2)
Entiendo cómo obtener el texto de un estilo div
o span
específico a partir de esta pregunta: cómo encontrar los estilos de tramo más comunes
Ahora la dificultad está tratando de encontrar todos los estilos de tramo con tamaños de fuente más grandes que el más común?
Sospecho que debería usar expresiones regulares, pero primero necesito extraer el tamaño de fuente más común específico?
Además, ¿cómo se determina "más grande que" cuando la condición es una cadena?
Esto puede ayudarte:
from bs4 import BeautifulSoup
import re
usedFontSize = [] #list of all font number used
#Find all the span contains style
spans = soup.find_all(''span'',style=True)
for span in spans:
#print span[''style'']
styleTag = span[''style'']
fontSize = re.findall("font-size:(/d+)px",styleTag)
usedFontSize.append(int(fontSize[0]))
#Find most commanly used font size
from collections import Counter
count = Counter(usedFontSize)
#Print list of all the font size with it''s accurence.
print count.most_common()
Para encontrar todos los estilos de tramo con tamaños de fuente más grandes que el estilo de tramo más común con BeautifulSoup, debe analizar cada estilo de CSS que se haya devuelto.
El análisis de CSS se realiza mejor usando una biblioteca como cssutils
. Esto le permitiría acceder al atributo fontSize
directamente.
Esto tendría un valor como 12px
que no se ordena de forma natural correctamente. Para evitar esto, puede usar una biblioteca como natsort
.
Entonces, primero analiza cada uno de los estilos en objetos css. Al mismo tiempo, guarde una lista de todas las sopas para cada intervalo, junto con el CSS analizado para el estilo.
Ahora use el atributo fontSize
como la clave para ordenar con natsort. Esto le daría una lista ordenada de estilos de acuerdo con su tamaño de fuente, la más grande primero (usando reverse=True
). takewhile()
se usa para crear una lista de todas las entradas de la lista hasta el punto donde el tamaño coincide con el más común, lo que da como resultado una lista de entradas más grande que la más común.
from bs4 import BeautifulSoup
from collections import Counter
from itertools import takewhile
import cssutils
import natsort
html = """
<span style="font-family: ArialMT; font-size:12px">1</span>
<span style="font-family: ArialMT; font-size:14px">2</span>
<span style="font-family: ArialMT; font-size:1px">3</span>
<span style="font-family: Arial; font-size:12px">4</span>
<span style="font-family: ArialMT; font-size:18px">5</span>
<span style="font-family: ArialMT; font-size:15px">6</span>
<span style="font-family: ArialMT; font-size:12px">7</span>
"""
soup = BeautifulSoup(html, "html.parser")
style_counts = Counter()
parsed_css_style = [] # Holds list of tuples (css_style, span)
for span in soup.find_all(''span'', style=True):
style_counts[span[''style'']] += 1
parsed_css_style.append((cssutils.parseStyle(span[''style'']), span))
most_common_style = style_counts.most_common(1)[0][0]
most_common_css_style = cssutils.parseStyle(most_common_style)
css_styles = natsort.natsorted(parsed_css_style, key=lambda x: x[0].fontSize, reverse=True)
print "Styles larger than most common font size of {} are:".format(most_common_css_style.fontSize)
for css_style, span in takewhile(lambda x: x[0].fontSize != most_common_css_style.fontSize, css_styles):
print " Font size: {:5} Text: {}".format(css_style.fontSize, span.text)
En el ejemplo que se muestra, el tamaño de letra más utilizado es 12px
, por lo que hay 3 entradas más grandes que esta de la siguiente manera:
Styles larger than most common font size of 12px are:
Font size: 18px Text: 5
Font size: 15px Text: 6
Font size: 14px Text: 2
Para instalarlo probablemente necesitará:
pip install natsort
pip install cssutils
Tenga en cuenta que esto supone que los tamaños de fuente utilizados son consistentes en su sitio web, no es capaz de comparar diferentes métricas de fuentes, solo el valor numérico.