在 dict pandas 中编写多列表

Posted

技术标签:

【中文标题】在 dict pandas 中编写多列表【英文标题】:Write multi list in dict pandas 【发布时间】:2021-11-16 10:21:16 【问题描述】:

我尝试解析站点并遇到此问题。我确定每件商品的最大图片数量为 7。每个图片链接写入列表。然后将其保存在 Excel 中。所以每个链接都有类似于文件 1.xlsx 中的列。但有些商品有 3 或 5 张图片。因此,如果图像数量少于 7,我想用空字符串填充另一个字段。但我得到的结果类似于文件 2.xlsx。

请帮我解决这个问题。

from datetime import datetime, timedelta
from time import sleep
import time, csv
from csv import reader
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.options import Options
import requests, json


def get_html(url):
    headers=
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
        
    r = requests.get(url, headers=headers).content
    return r

goods_link = ['https://www.johnlewis.com/a-a-k-s-hana-raffia-cross-body-bag-navy-multi/p5559710']


Images1 = []
Images2 = []
Images3 = []
Images4 = []
Images5 = []
Images6 = []
Images7 = []
Img = []

for i in goods_link:
    soup = BeautifulSoup(get_html(i), 'html.parser')

    imgContainer = soup.find('div', 'class':'ProductImages_productImagesContainer__1v2kP')
    imgAll = imgContainer.find_all('div', 'class':'ImageMagnifier_zoomable-image-container__db7jH')
    for j in imgAll:
        imgSrc = j.find('img').get('src').split('?$rsp')[0]
        Img.append(imgSrc)

    [x.append(y) for x,y in zip([Images1, Images2, Images3, Images4, Images5, Images6, Images7], Img)]

info = 


for ii in Images1:
    info.setdefault('Images1',[])
    info['Images1'].append(ii)
for ii in Images2:
    info.setdefault('Images2',[])
    info['Images2'].append(ii)
for ii in Images3:
    info.setdefault('Images3',[])
    info['Images3'].append(ii)
for ii in Images4:
    info.setdefault('Images4',[])
    info['Images4'].append(ii)
for ii in Images5:
    info.setdefault('Images5',[])
    info['Images5'].append(ii)
for ii in Images6:
    info.setdefault('Images6',[])
    info['Images6'].append(ii)
for ii in Images7:
    info.setdefault('Images7',[])
    info['Images7'].append(ii)

df = pd.DataFrame.from_dict(info)
df.to_excel('./output.xlsx')

print('Finish')

【问题讨论】:

【参考方案1】:

您希望为每行填充所有 7 列,即使该行的图像少于 7 张。 创建字典的步骤是多余的。您可以在列表中列出所有图像,然后将其添加到列表列表中,并从中创建 DataFrame。 您可以使用columns= 指定标题:

def get_html(url):
    headers=
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
        
    r = requests.get(url, headers=headers).content
    return r

goods_link = ['https://www.johnlewis.com/a-a-k-s-hana-raffia-cross-body-bag-navy-multi/p5559710']


headers = ["Images1", "Images2", "Images3", "Images4", "Images5", "Images6", "Images7"]
img_table = []

for link in goods_link:
    img_row = [None]*7
    soup = BeautifulSoup(get_html(link), 'html.parser')

    imgContainer = soup.find('div', 'class':'ProductImages_productImagesContainer__1v2kP')
    imgAll = imgContainer.find_all('div', 'class':'ImageMagnifier_zoomable-image-container__db7jH')
    for j, div_obj in enumerate(imgAll):
        imgSrc = div_obj.find('img').get('src').split('?$rsp')[0]
        img_row[j]=imgSrc

    img_table.append(img_row)   

df = pd.DataFrame(img_table, columns=headers)
df.to_excel('./output.xlsx')

print('Finish')

缺少的是创建一个长度为 7 的 None 列表,然后使用 enumerate 将索引 j 处的元素替换为相应的链接。

请尝试以使代码下次更容易理解的方式命名您的变量。

【讨论】:

它的工作!非常感谢!!

以上是关于在 dict pandas 中编写多列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含Python3中特定索引和列的列表的dict创建Pandas DataFrame?

将嵌套的 dict 列表展平为 Pandas Dataframe

将dict列表转换为pandas中的行[重复]

如何将Pandas中的非零条目转换为带有列表的dict?

SyntaxError dict[0] 不在列表中,但 dict[0] 在列表中有效? [关闭]

Pandas Dataframe 检查列值是不是在列列表中