82466


Python3で`openpyxl`を使ってExcelのデータを読み込みTwitterへ検索しています。  
各国を検索したらExcelのD列に`処理済み`の結果を記載したいですが、  
上手く処理できないです。

自分の力不足が大きいのですが、調べていてイマイチ記述方法がわかりません。  
申し訳ないのですが、皆さんのお知恵をお借りできないでしょうか？  
よろしくお願いいたします。

**Excel Data**

国 | 都市 | 地域数  
---|---|---  
アメリカ | カリフォルニア | 22  
アメリカ | フロリダ | 22  
フランス | パリ | 13  
日本 | 東京 | 26  
日本 | 沖縄 | 10  
日本 | 京都 | 11  
  
**実現したいエクセルの結果 RESULT Excel Data**  
例：ループで完了している場合、  
下記のように`処理済み `のフラグをつけたいです。  
元々はエクセルにはヘッダーがないですのでD列からつけたいです。

国 | 都市 | 地域 | フラグ  
---|---|---|---  
アメリカ | カリフォルニア | 22 | 処理済み  
アメリカ |  フロリダ | 22 |  
フランス | パリ | 13 | 処理済み  
日本 | 東京 | 26 | 処理済み  
日本 |  沖縄 | 14 |  
日本 | 京都 | 11 |  
  
**Code**

[code]

    # Excel用ライブラリ読込
    import openpyxl
    from selenium.webdriver.common.keys import Keys
    import time
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.select import Select  
    from selenium import webdriver
    import pyautogui
    import pandas as pd
    
    # Excelファイルを開く
    v_wb = openpyxl.load_workbook("test.xlsx")
    
    # アクティブなシートを変数へ
    v_ws = v_wb.active
    # シートのロード
    ws = v_wb.worksheets[0]
    
    # convert to pandas dataframe
    df = pd.DataFrame(ws.values)
    print(df)
    
    
    # generate search words
    lst = (
      df.groupby(1, as_index=False)[2]
        .agg(lambda x: x.tolist())
        .apply(lambda x: [x[1]] + x[2], axis=1)
    
        .tolist()
    )
    print(lst)
    
    URL = "https://twitter.com/search-advanced?lang=en"
    
    # ブラウザを開く。 #options=option background 
    options = Options()
    options.add_experimental_option('detach', True)
    driver = webdriver.Chrome(executable_path="C:\\Program Files\\chromedriver_win32\\chromedriver.exe", options=options)
    
    for i, query in enumerate(lst):
        # Googleの検索TOP画面を開く。
        if i > 0:
          driver.execute_script('window.open()')
        driver.switch_to.window(driver.window_handles[i])
        driver.get(URL)
    
        # 2秒待機
        time.sleep(2)
    
        # country
        country = driver.find_element_by_name("allOfTheseWords")
        country.send_keys(query[0])
    
        # 2秒待機
        time.sleep(2)
    
        # 都市1つ以上がある場合、c列を入力
        if len(query) > 1:
          city2 = driver.find_element_by_name("thisExactPhrase")
          city2.send_keys(query[1])
    
        # 都市2つ以上がある場合、c列を入力
        if len(query) > 2:
          city2 = driver.find_element_by_name("anyOfTheseWords")
          city2.send_keys(query[2])
    
        # 都市3つ以上がある場合、c列を入力
        if len(query) > 3:
          city3 = driver.find_element_by_name("noneOfTheseWords")
          city3.send_keys(query[3])
          
        # 処理済みのでデータをD列へ入力
        v_ws['D'+str(i+1)].value = str("処理済み")      
    
    # EXCEL保存  
    v_wb.save("test.xlsx")
    
        
    
[/code]

**現在の結果**  
フランスまでしか処理済み書き込みされないです。

国 | 都市 | 地域 | フラグ  
---|---|---|---  
アメリカ | カリフォルニア | 22 | 処理済み  
アメリカ |  フロリダ | 22 | 処理済み  
フランス | パリ | 13 | 処理済み  
日本 | 東京 | 26 |  
日本 |  沖縄 | 14 |  
日本 | 京都 | 11 |


CC BY-SA 4.0
2021-09-06T04:34:14.730
82275
2021-09-14T01:58:52.940
2021-09-10T05:35:11.370
3060
18859
question
python python3 openpyxl
openpyxl を使って Excel ファイルに列を追加しデータを追記したい

[code]

    # Excel用ライブラリ読込
    import openpyxl
    from selenium.webdriver.common.keys import Keys
    import time
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.select import Select  
    from selenium import webdriver
    import pyautogui
    import pandas as pd
    
    # Excelファイルを開く
    v_wb = openpyxl.load_workbook("test.xlsx")
    
    # アクティブなシートを変数へ
    v_ws = v_wb.active
    # シートのロード
    ws = v_wb.worksheets[0]
    
    # convert to pandas dataframe
    data = ws.values
    columns = next(data)
    df = pd.DataFrame(data, columns=columns)
    print(df)
    
    # generate search words
    lst = (
      df.groupby('国', as_index=False)['都市']
        .agg(lambda x: x.tolist())
        .apply(lambda x: [x['国']] + x['都市'], axis=1)
        .tolist()
    )
    print(lst)
    df['フラグ'] = ''
    
    URL = "https://twitter.com/search-advanced?lang=en"
    
    # ブラウザを開く。 #options=option background 
    options = Options()
    options.add_experimental_option('detach', True)
    driver = webdriver.Chrome(executable_path="C:\\Program Files\\chromedriver_win32\\chromedriver.exe", options=options)
    
    for i, query in enumerate(lst):
        # Googleの検索TOP画面を開く。
        if i > 0:
          driver.execute_script('window.open()')
        driver.switch_to.window(driver.window_handles[i])
        driver.get(URL)
    
        # 2秒待機
        time.sleep(2)
    
        # country
        country = driver.find_element_by_name("allOfTheseWords")
        country.send_keys(query[0])
    
        # 2秒待機
        time.sleep(2)
    
        # 都市1つ以上がある場合、c列を入力
        if len(query) > 1:
          city2 = driver.find_element_by_name("thisExactPhrase")
          city2.send_keys(query[1])
    
        # 都市2つ以上がある場合、c列を入力
        if len(query) > 2:
          city2 = driver.find_element_by_name("anyOfTheseWords")
          city2.send_keys(query[2])
    
        # 都市3つ以上がある場合、c列を入力
        if len(query) > 3:
          city3 = driver.find_element_by_name("noneOfTheseWords")
          city3.send_keys(query[3])
    
        # 処理済みのでデータをD列へ入力
        df.loc[(df['国'] == query[0]).idxmax(), 'フラグ'] = "処理済み"
    
        pyautogui.press(['enter'])
    
    # EXCEL保存  
    df.to_excel("test2.xlsx", index=False)
    
[/code]

**test2.xlsx**

国 | 都市 | 地域数 | フラグ  
---|---|---|---  
アメリカ | カリフォルニア | 22 | 処理済み  
アメリカ | フロリダ | 22 |  
フランス | パリ | 13 | 処理済み  
日本 | 東京 | 26 | 処理済み  
日本 | 沖縄 | 10 |  
日本 | 京都 | 11 |


CC BY-SA 4.0
2021-09-13T16:12:16.733
82466
2021-09-13T16:12:16.733
47127
82275
answer


下記の３点を変更・追加しましたら、実現したい内容処理できました。

①

[code]

    groupbyにsort=Falseを追加して、データをソートさせないようにする。
    エクセル順番で行う。
    
[/code]

②

[code]

    #ループ処理の部分とエクセルへの書き込み処理(行)が合っていないので、
    #row = 1を追加
    
    row = 1
    
[/code]

③

[code]

     # 処理済みのでデータをD列へ入力
        v_ws['D'+str(row)].value = str("処理済み")
        
        #追加した行とリストのデータと合わせる  
        row += len(query) - 1
    
[/code]

[code]

    # generate search words 
    # sort=False データソートせずにエクセル順番で行う
    lst = (
      df.groupby(1, sort=False,as_index=False)[2]
        .agg(lambda x: x.tolist())
        .apply(lambda x: [x[1]] + x[2], axis=1)
    
        .tolist()
    )
    print(lst)
    
    URL = "https://twitter.com/search-advanced?lang=en"
    
    # ブラウザを開く。 #options=option background 
    options = Options()
    options.add_experimental_option('detach', True)
    driver = webdriver.Chrome(executable_path="C:\\Program Files\\chromedriver_win32\\chromedriver.exe", options=options)
    
    #ループ処理の部分とエクセルへの書き込み処理(行)が合っていないので、
    #row = 1を追加
    
    row = 1
    
    for i, query in enumerate(lst):
        # Googleの検索TOP画面を開く。
        if i > 0:
          driver.execute_script('window.open()')
        driver.switch_to.window(driver.window_handles[i])
        driver.get(URL)
    
        # 2秒待機
        time.sleep(2)
    
        # country
        country = driver.find_element_by_name("allOfTheseWords")
        country.send_keys(query[0])
    
        # 2秒待機
        time.sleep(2)
    
        # 都市1つ以上がある場合
        if len(query) > 1:
          city2 = driver.find_element_by_name("thisExactPhrase")
          city2.send_keys(query[1])
          print(' 都市1つ以上')
    
        # 都市2つ以上がある場合
        if len(query) > 2:
          city2 = driver.find_element_by_name("anyOfTheseWords")
          city2.send_keys(query[2])
          print(' 都市2つ以上')
    
        # 都市3つ以上がある場合
        if len(query) > 3:
          city3 = driver.find_element_by_name("noneOfTheseWords")
          city3.send_keys(query[3])
          print(' 都市3つ以上')
      
        print('D'+str(row), str("処理済み")  )
        # 処理済みのでデータをD列へ入力
        v_ws['D'+str(row)].value = str("処理済み")
        
        #追加した行とリストのデータと合わせる  
        row += len(query) - 1
    
      
    # EXCEL保存  
    v_wb.save("test2.xlsx")
    
    
[/code]


CC BY-SA 4.0
2021-09-14T01:58:52.940
82473
2021-09-14T01:58:52.940
18859
82275
answer