首页 > 解决方案 > 使用 Selenium 在电子商务页面(产品样本颜色)上抓取嵌套元素

问题描述

当色板元素嵌套且没有类名时,我试图从 Ulta 的网站上抓取产品色板颜色名称 ('alt') 和 img srcs。我的抓取结果包括我不想要的其他元素,但我不确定(对于 python 和抓取也是非常新的)如何删除它们。

网址:https ://www.ulta.com/born-this-way-undetectable-medium-full-coverage-foundation?productId=xlsImpprod12621017

html截图:

截屏

我的代码:

driver = webdriver.Chrome(chromedriver)
driver.get(url)
time.sleep(10)

shade_names = []

elems = driver.find_elements_by_class_name('Loader__small')
for elem in elems:
    img = elem.find_element_by_tag_name('img')
    name = img.get_attribute('alt').encode('utf-8')
    shade_names.append(name)

print(shade_names)

我的代码的结果(我不想要'Cloud (fairest w/ rosy undertones)'之前的文本和尾部的引号):

“Ulta Beauty Collection”、“Chanel”、“Anastasia Beverly Hills”、“Clinique”、“Urban Decay Cosmetics”、“Bumble and Bumble”、“Tom Ford”、“Tarte Cosmetics”、“Makeup Revolution”、“Kiehl's” , 'Morphe', 'Too Faced', 'Fan fave', 'Too Faces Born This Way Undetectable中度至全覆盖粉底自然米色(浅中度带中性底色)#1'、'Too Faced Born This Way Undetectable Medium-to-Full Coverage Foundation Natural Beige(浅中度带中性底色)#2'、'Too Faced Born This Way 无法察觉的中度至全覆盖粉底自然米色(浅中度带中性底色)#3'、'Too Faced Born This Way 无法察觉的中度至全覆盖度粉底自然米色(轻中度带中性底色) ) #4', 'Too Faced Born This Way Undetectable Medium-to-Full Coverage Foundation Natural Beige(浅色中性底色)#5', 'Shade Finder Image', 'Natural Beige(浅色中性色/中性底色)已选择”、“云朵(带有玫瑰色底色)”、“天鹅色(带有中性底色)”、“雪色(带有玫瑰色底色)”、“象牙色(带有金色底色)”、“珍珠色(非常白,带有玫瑰色底色)','杏仁(非常白,带有金色底色)','贝壳(非常白,带有玫瑰色底色)',“瓷器(非常白,带有中性底色)”,“香草(带有中性底色)”,“裸色(非常轻,带有玫瑰色底色)”,“暖裸色(非常轻,带有中性底色)”,“浅色米色(带中性底色的浅色)'、'已选择自然米色(带中性底色的浅色)'、'金色米色(带金色底色的浅色)'、'暖米色(带中性底色的中色)'、'沙色(中等带金色底色)'、'金色(中等带玫瑰色底色)'、'果仁糖(中等棕褐色带金色底色)'、'暖沙色(棕褐色带金色底色)'、'蜂蜜(棕褐色带/中性底色)','焦糖(浓郁棕褐色,带有中性底色)','布鲁里(浓郁棕褐色,带有金色底色)','摩卡(浓郁棕褐色,带有玫瑰色底色)',“黄油山核桃(最浓郁的棕褐色,带有金色底色)”,“枫木(深带有中性底色)”,“栗色(深带有金色底色)”,“柴(深带有金色底色)”,“桃花心木(非常深带金色底色)'、'五香朗姆酒(带玫瑰色底色非常深)'、'榛子(带玫瑰色底色最深)'、'可可(带中性底色最深)'、'提拉米苏(带金色底色最深) undertones) ', 'Sable (rich w/ rosy undertones) ', 'Truffle (rich w/ gold undertones)', 'Ganache (richest w/neuttone undertones) ', '', '', '', '', ' ', '', '', '', '', '', '', ''枫木(深沉,带中性底色)','栗木(深沉,带金色底色)','柴(深带金色底色)','桃花心木(深沉,带金色底色)','五香朗姆酒(深沉)带有玫瑰色底色)','榛子(带有玫瑰色底色的最深)','可可(带有中性底色的最深)','提拉米苏(带有金色底色的最深)','Sable(带有玫瑰色底色的浓郁)' , '松露(丰富的带有金色底色)', 'Ganache(最丰富的带有中性底色)', '', '', '', '', '', '', '', '', '', '', '', ''枫木(深沉,带中性底色)','栗木(深沉,带金色底色)','柴(深带金色底色)','桃花心木(深沉,带金色底色)','五香朗姆酒(深沉)带有玫瑰色底色)','榛子(带有玫瑰色底色的最深)','可可(带有中性底色的最深)','提拉米苏(带有金色底色的最深)','Sable(带有玫瑰色底色的浓郁)' , '松露(丰富的带有金色底色)', 'Ganache(最丰富的带有中性底色)', '', '', '', '', '', '', '', '', '', '', '', ''五香朗姆酒(非常深,带有玫瑰色的底色)','榛子(最深的带有玫瑰色的底色)','可可(最深的带有中性底色)','提拉米苏(最深的带有金色底色)','Sable(浓郁的 w / 玫瑰色底色)','松露(丰富的带有金色底色)','Ganache(最丰富的带有中性底色)','','','','','','','',' ', '', '', '', ''五香朗姆酒(非常深,带有玫瑰色的底色)','榛子(最深的带有玫瑰色的底色)','可可(最深的带有中性底色)','提拉米苏(最深的带有金色底色)','Sable(浓郁的 w / 玫瑰色底色)','松露(丰富的带有金色底色)','Ganache(最丰富的带有中性底色)','','','','','','','',' ', '', '', '', ''', '', '', '', '', '', '', '', '', '', ''', '', '', '', '', '', '', '', '', '', ''

标签: pythonseleniumweb-scraping

解决方案


在您的time.sleep(10)行之后,我添加了以下代码部分。对我来说它正在工作。请你也试试。

代码

time.sleep(10)

shade_names = []

elems = driver.find_elements_by_class_name('ProductSwatches__Cell')
for elem in elems:
    img = elem.find_element_by_tag_name('img')
    name = img.get_attribute('alt')
    name = name.split(' ')[0]
    shade_names.append(name)

print([x for x in shade_names if x])

对我来说,结果是这样的:

['云','天鹅','雪','象牙','珍珠','杏仁','贝壳','瓷器','香草','裸色','温暖','光','天然”、“金色”、“暖色”、“沙色”、“金色”、“果仁糖”、“暖色”、“蜂蜜”、“焦糖”、“布鲁利”、“摩卡”、“黄油”、“枫木” , '栗子', '柴', '桃花心木', '五香', '榛子', '可可', '提拉米苏', '黑貂', '松露', '甘纳许']

我看到有 36 种颜色,所以计数器结果也是正确的。


推荐阅读