82774


**実現したいこと**  
data = (title, lead, url,
author)という4つのロウデータが存在します。このデータの塊を1つとして計100個分のデータセットがエクセルにあります。これらを1つずつ取り出し、さらにその4つを適切なフォームに入れたいです。そこで辞書型データをどのようにデータに分けて、繰り返しでセルを次の数字にしていくのか、またそれをsend_keyに入れていくのがわかりません。どなたか教えていただけないでしょうか？

マルチポスト先：[リンク](https://teratail.com/questions/361924)  
**現在できていること**

以下のように1つずつセルを取り出し、入力することはできました。

[code]

    v_excel_title = ws['b8'].value
    v_excel_lead = ws['f8'].value
    v_excel_url = ws['g8'].value
    v_excel_author = ws['d8'].value
    time.sleep(1)
    
    v_title = driver.find_element_by_id('id_title').send_keys(v_excel_title)
    v_c_title = driver.find_element_by_id('id_content_title').send_keys(v_excel_title)
    v_lead = driver.find_element_by_id('id_heading').send_keys(v_excel_lead)
    v_url = driver.find_element_by_id('id_content_url').send_keys(v_excel_url)
    v_author = driver.find_element_by_id('id_creator').send_keys(v_excel_author)
    
    
[/code]

あとはこれを自動で次の、次のデータと進むようまとめる必要があります。以下で辞書型にするところまではできました。あとはこれをforで取り出して、上記のコードにするだけです。

[code]

    #read excel
    
    file = input("ファイルを入力してください:")
    wb = openpyxl.load_workbook(file)
    ws = wb["XXX"]
    
    data_list = []
    header_cells = None
    
    for row in ws.rows:
        if row[0].row == 1:
            header_cells = row
        else:
            row_dic = {}
            for k, v in zip(header_cells, row):
                row_dic[k.value] = v.value
            data_list.append(row_dic)
    
    for data in data_list:
    print(data_list)
    
    >>dict_keys(['title', 'date', 'author', 'creator url', 'lead', 'url', None])
    >>dict_keys(['title', 'date', 'author', 'creator url', 'lead', 'url', None])
    >>dict_keys(['title', 'date', 'author', 'creator url', 'lead', 'url', None])
    
[/code]

しかし、これをどうそれぞれv_excel…のデータに入れて、繰り返しでセルを次の数字にしていくのか。またそれをsend_keyに入れていくのがわかりません。どなたか教えていただけないでしょうか？

* * *

**追記**

[code]

    def send_keys(driver, data):
        v_excel_title = data['title']
        v_excel_lead = data['lead']
        v_excel_author = data['author']
        v_excel_url = data['url']
        
    v_title = driver.find_element_by_id('id_title').send_keys(v_excel_title)
    v_c_title = driver.find_element_by_id('id_content_title').send_keys(v_excel_title)
    v_lead = driver.find_element_by_id('id_heading').send_keys(v_excel_lead)
    v_url = driver.find_element_by_id('id_content_url').send_keys(v_excel_url)
    v_author = driver.find_element_by_id('id_creator').send_keys(v_excel_author)
    
[/code]

どうしてもここだけわからないのですが、これをどのようにエレメント見つけて入れることができるようになるのでしょうか？

[code]

    from selenium import webdriver
    import selenium
    import time
    
    import openpyxl
    
    
    #read excel
    file = input("ファイルを入力してください:")
    sheet = input("ワークシートを入力してください:")
    
    
    #get to login Page
    
    driver = webdriver.Chrome("")
    TARGET_URL = ""
    driver.get(TARGET_URL)
    time.sleep(2)
    
    #input signin information
    user = driver.find_element_by_id("id_username").send_keys("")
    password = driver.find_element_by_id("id_password").send_keys("")
    signin = driver.find_element_by_css_selector("")
    signin.click()
    
    def create_data_list():
        wb = openpyxl.load_workbook(file, data_only=True)
        ws = wb[sheet]
    
        data_list = []
        header_cells = ws[1]
    
        for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
            row_dic = dict([(k.value, v.value) for k, v in zip(header_cells, row)])
            data_list.append(row_dic)
            return data_list
            
    create_data_list()
    
    for data in data_list:
        v_excel_title = data['title']
        v_excel_lead = data['lead']
        v_excel_author = data['author']
        v_excel_url = data['url'] 
    
    v_title = driver.find_element_by_id('id_title').send_keys(v_excel_title)
    v_c_title = driver.find_element_by_id('id_content_title').send_keys(v_excel_title)
    v_lead = driver.find_element_by_id('id_heading').send_keys(v_excel_lead)
    v_url = driver.find_element_by_id('id_content_url').send_keys(v_excel_url)
    v_author = driver.find_element_by_id('id_creator').send_keys(v_excel_author)
        
    #save
    save_draft = driver.find_element_by_css_selector("button.action-save.button-longrunning")
    save_draft.click()
       
    
[/code]


CC BY-SA 4.0
2021-09-30T02:36:02.227
82769
2021-10-01T07:30:20.000
2021-10-01T07:30:20.000
48024
48024
question
python
for文を用いて辞書型データをそれぞれ適切なフォームに入れたい。


以下では `openpyxl` ではなく、`pandas` パッケージの
[`read_excel()`](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.read_excel.html#pandas-read-excel) を利用して
Excel のシートを読み込みます。

[code]

    import pandas as pd
    from selenium import webdriver
    
    df = pd.read_excel('test.xlsx', sheet_name='XXX')
    driver = webdriver.Chrome(executable_path='...') # ここは適当に
    
    header = ('id_title', 'id_content_title', 'id_heading', 'id_content_url', 'id_creator')
    data_keys = ['title', 'title', 'lead', 'url', 'author']
    for data in df[data_keys].iterrows():
      for id, attr in zip(header, data[1]):
        driver.find_element_by_id(id).send_keys(attr)
      # おそらくフォームの submit ボタンを押す、という動作が必要
    
[/code]

ここで `df` は以下の様になっていて、これを行毎に処理しています。

title | date | author | creator url | lead | url  
---|---|---|---|---|---  
タイトル1 | 2021-09-30 00:00:00 | 著者1 | creator URL1 | 筆頭著者1 | URL1  
タイトル2 | 2021-10-01 00:00:00 | 著者2 | creator URL2 | 筆頭著者2 | URL2  
タイトル3 | 2021-10-02 00:00:00 | 著者3 | creator URL3 | 筆頭著者3 | URL3  
タイトル4 | 2021-10-03 00:00:00 | 著者4 | creator URL4 | 筆頭著者4 | URL4  
タイトル5 | 2021-10-04 00:00:00 | 著者5 | creator URL5 | 筆頭著者5 | URL5


CC BY-SA 4.0
2021-09-30T08:08:14.583
82774
2021-09-30T08:08:14.583
47127
82769
answer
  
  
エクセルを行ごとに読み取って辞書型データを作成できているので、あとはそれを適切に取り出すだけです。  
後半のコード末尾を流用し、関数などを使って辞書型データを`v_excel…`に渡しましょう。

下記のコードを実行すると、コメントのような実行結果が返ります。

[code]

    for data in data_list:
        print(data)
        print(data['title'])
        # print(data['b8']) # これはエラーになる
    
    # {None: 1, 'title': 'hoge', 'date': datetime.datetime(2021, 9, 30, 0, 0), 'author': 'foo', 'creator url': None, 'lead': 'hogefoo', 'url': 'https://hogefoo.com'}
    # hoge
    # {None: 2, 'title': 'fuga', 'date': datetime.datetime(2021, 9, 30, 0, 0), 'author': 'bar', 'creator url': None, 'lead': 'fugabar', 'url': 'https://fugabar.com'}
    # fuga
    # {None: 3, 'title': 'piyo', 'date': datetime.datetime(2021, 9, 30, 0, 0), 'author': 'baz', 'creator url': None, 'lead': 'piyobaz', 'url': 'https://piyobaz.com'}
    # piyo
    
[/code]

つまり既にヘッダをキーにした辞書型データが`data_list`に行数分のリストとして入っています。  
下記のようなコードで辞書型データをご質問前半に繰り返しで渡すことで、要望を実現できるはずです。

[code]

    def send_keys(driver, data):
        v_excel_title = data['title']
        v_excel_lead = data['lead']
        v_excel_author = data['author']
        # 以下略(フォーム項目のリセットなどは適切に行ってください)
    
    # あらかじめWebドライバを用意しておく例
    # from selenium import webdriver
    # driver = webdriver.Chrome()
    
    for data in data_list:
        send_keys(driver, data)
    
    driver.quit()
    
[/code]

* * *

検証コード

[code]

    import openpyxl
    
    #前半のコード
    def send_keys(driver, data):
        v_excel_title = data['title']
        v_excel_lead = data['lead']
        v_excel_author = data['author']
        # 以下略(フォーム項目のリセットなどは適切に行ってください)
        print(v_excel_title)
    
    #read excelのコードを書き換えたもの
    def create_data_list():
        wb = openpyxl.load_workbook('Book1.xlsx', data_only=True)
        ws = wb["Sheet1"]
    
        data_list = []
        header_cells = ws[1]
    
        for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
            row_dic = dict([(k.value, v.value) for k, v in zip(header_cells, row)])
            data_list.append(row_dic)
    
        return data_list
    
    data_list = create_data_list()
    for data in data_list:
        print(data)
        send_keys(None, data)
    
[/code]


CC BY-SA 4.0
2021-09-30T08:12:59.693
82775
2021-09-30T08:12:59.693
9820
82769
answer