from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 找到百度一下这个按钮元素
ele_baidu = driver.find_element('id','su')
# 获取其css属性background-color
color = ele_baidu.value_of_css_property('background-color')
print(color) #rgba(78, 110, 242, 1)
print(type(color)) # str类型
selenium提供了一个类Color专门用于对颜色进行转换处理
color = 'rgba(78, 110, 242, 1)'
print(Color.from_string(color).hex) # #4e6ef2
看看源码,它是怎么实现的
@classmethod
def from_string(cls, str_: str) -> Color:
# 类方法,传入str(颜色),返回一个Color实例
# Color的init
def __init__(self, red: ParseableInt, green: ParseableInt, blue: ParseableInt,
alpha: ParseableFloat = 1) -> None:
self.red = int(red)
self.green = int(green)
self.blue = int(blue)
self.alpha = "1" if float(alpha) == 1 else str(float(alpha) or 0)
# 那实例的参数怎么来的呢, 关键是正则
elif m.match(RGBA_PATTERN, str_):
return cls(*m.groups)
# 其中PATTERN很关键
RGBA_PATTERN = r"^\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0|1|0\.\d+)\s*\)\s*$"
@property
def hex(self) -> str:
return f"#{self.red:02x}{self.green:02x}{self.blue:02x}"
综上:from_string类方法传入字符串'rgba(78, 110, 242, 1)',根据正则RGBA_PATTERN解析得到三元组,对Color进行实例化,进而调用hex方法(装饰为属性),得到一个转换后的#4e6ef2
上面的方法无疑是非常牛的,对正则比较熟悉的话可以借鉴,但我写不出来这样的正则
我们可以用非常简单的方法来做(适配性不会那么好)
无非就是对一个字符串'rgba(78, 110, 242, 1)'中的数字进行转换#4e6ef2 ,不考虑alpha的话
由于有形式是rgb的,归纳为第一个(左括号后面的3个数字字符,拿到后转换下即可。
demo
color = 'rgba(78, 110, 242, 1)'
print(color.index('(')) # 左括号的index
print(color.index(')')) # 右括号的index
print(color[color.index('(')+1:color.index(')')]) # 左右括号中间的部分
print(color[color.index('(')+1:color.index(')')].split(',')[:3]) # 用,切割
rgb = color[color.index('(')+1:color.index(')')].split(',')[:3]
print('#'+''.join([hex(int(_.strip()))[-2:] for _ in rgb])) # #4e6ef2
稍作封装
def colorstr_to_hex(colorstr):
start = colorstr.index('(')
end = colorstr.index(')')
rgb = colorstr[start+1:end].split(',')[:3]
return '#'+''.join([hex(int(_.strip()))[-2:] for _ in rgb])
color = 'rgba(78, 110, 242, 1)'
print(colorstr_to_hex(color)) # #4e6ef2
def hex_to_rgb(hexstr):
return tuple(int(hexstr.lstrip('#')[i:i+2], 16) for i in (0, 2, 4))
print(hex_to_rgb('#4e6ef2'))