Возьмите все цвета веб-страницы с питоном - PullRequest
0 голосов
/ 29 апреля 2019

Я хотел бы найти эффективный способ извлечь какую-то цветовую палитру (список или что-то еще) из заданного URL-адреса страницы с помощью Python.То, что я хочу, это взять все цвета фона, цвета заголовков и всех других элементов.

Я уже видел здесь [ Создание цветовой палитры по URL-адресу изображения ], что можно взять палитру из изображения, но как насчет страницы?

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Я попробовал следующее, что сработало для меня: идея состоит в том, чтобы получить доступ к источнику страницы с помощью selenium, затем я ищу все строки, начинающиеся с '<', и помещаю их в список, удаляя ' <с самого начала. Затем я перебираю список и для каждого использую <em>value_of_css_property и ищу цвет фона, цвет рамки, цвет фона и изображение. Я знаю, что это не идеально, но делает то, что я искал. Не забудьте удалить дубликаты из списка тегов (поскольку этот метод выдаст список всех свойств css-color каждого тега). Пример:

url ="someurl"
options = webdriver.ChromeOptions()
options.headless = False
driver = webdriver.Chrome(options=options)
driver.get(url)
list_tags = []
html_source = driver.page_source
txt = re.findall(r'<[a-zA-Z]+', html_source)
for x in txt:
    list_tags.append(x.replace('<', ''))
list_tags = list(dict.fromkeys(list_tags))
final_list = []

for i in list_tags:
 tag = driver.find_elements_by_tag_name(i)
 tag_back_col = []
 tag_col = []
 tag_img = []
 tag_border = []
 for j in tag:
      back_col = j.value_of_css_property('background-color')
      tag_back_col.append(back_col)
      col = j.value_of_css_property('color')
      tag_col.append(col)
      bord = j.value_of_css_property('border-color')
      tag_border.append(bord)
      img = j.value_of_css_property('background-image')
      tag_img.append(img)
  final_list .append((i, tag_back_col, tag_col, tag_border, tag_img))
driver.close()

Финальным списком будет список кортежей с именем тега и списками цветов фона, цветов, цветов границ и фона для каждого вхождения этого тега на странице.

0 голосов
/ 30 апреля 2019

Сделал это при смешивании селена с вашим примером выше. Ниже приведен пример, как получить десятку лучших цветов из поиска Google.

Просто сделайте скриншот веб-страницы с помощью веб-сканера, а затем обработайте изображение

#!/bin/env python3
from selenium import webdriver
import numpy as np
from PIL import Image

def palette(img):
    """
    Return palette in descending order of frequency
    """
    arr = np.asarray(img)
    palette, index = np.unique(asvoid(arr).ravel(), return_inverse=True)
    palette = palette.view(arr.dtype).reshape(-1, arr.shape[-1])
    count = np.bincount(index)
    order = np.argsort(count)
    return palette[order[::-1]]

def asvoid(arr):
    """View the array as dtype np.void (bytes)
    This collapses ND-arrays to 1D-arrays, so you can perform 1D operations on them.
    http://stackoverflow.com/a/16216866/190597 (Jaime)
    http://stackoverflow.com/a/16840350/190597 (Jaime)
    Warning:
    >>> asvoid([-0.]) == asvoid([0.])
    array([False], dtype=bool)
    """
    arr = np.ascontiguousarray(arr)
    return arr.view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[-1])))


def savePrint(imageFile):
    driver = webdriver.Firefox()
    driver.get("https://google.com.br")    
    driver.get_screenshot_as_file(imageFile)

imageFile = '/tmp/tmp.png'
savePrint(imageFile)
img = Image.open(imageFile, 'r').convert('RGB')
print(palette(img)[:10])
...