82488


**やりたいこと**

とあるサイトをスクレイピングしました。  
データは取得しましたが、下記のコードのようにnicknameやidなどは通信状況を調べ、  
json形式で取得しましたが、twitterURLはseleniumで取得しました。

そのため、片方はデータフレームであり、もう片方は辞書型となっております。  
そこで辞書形式のデータのほうをデータフレームに変換した後、二つのデータをまとめたいと  
思っているのですがうまくいきません。

どのようにすればうまくいくか教えていただけるとありがたいです。

**試したこと**  
このような形で変換しようとしたがうまくいかなかった。  
df2 = []  
df2 = pd.DataFrame.from_dict(file, orient='index').T

**実際のコード**

[code]

    import pandas as pd
    import requests
    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from time import sleep
    from webdriver_manager.chrome import ChromeDriverManager
    import re
    import datetime
    
    url_rank = 'https://jp-api.spooncast.net/ranks/fan/?date_type=daily'
    headers = {'Content-Type': 'application/json'}
    
    df = []
    while url_rank:
      json_data = requests.get(url_rank, headers=headers).json()
      data = pd.DataFrame.from_records(i['author'] for i in json_data['results'])
      df.append(data[['nickname', 'id']])
      url_rank = json_data['next']
    
    df = pd.concat(df).reset_index(drop=True)
    
    browser = webdriver.Chrome(ChromeDriverManager().install()) #ブラウザ起動
    file = []
    for userid in df['id']:
        spoon_url = 'https://www.spooncast.net/jp/profile/' + str(userid) + '/board?t=all'
        
        #spoonURL取得
        browser.get(spoon_url)
        sleep(1.2)
        WebDriverWait(browser, 15).until(EC.presence_of_all_elements_located)
        
        
        Turlxpath = '//*[@id="root"]/div/main/div/div[1]/div[1]/div[1]/div[2]/div/div/ul/li/a'
        try:
            elem_TURL = browser.find_element_by_xpath(Turlxpath)
            Twitterurl = elem_TURL.get_attribute("href")
            
        except NoSuchElementException:
            continue
            
        details = {}
        detum = details
        
        
        detum['spoonURL'] = spoon_url
        detum['TwitterURL'] = Twitterurl
        
        file.append(detum)
        
        
    df2 = []
    df2 = pd.DataFrame.from_dict(file, orient='index').T    
        
          
    df2
    
    
    print('csvファイル作成中')
    info = pd.DataFrame(file) 
    csv_name = datetime.datetime.today().strftime("%Y%m%d%H%M")
    csv = info.to_csv(csv_name + '.csv')
    csv
    print('Scraping終了')
    
[/code]

**エラーコード**

[code]

    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-41-5d5260dbdb39> in <module>
         54 
         55 df2 = []
    ---> 56 df2 = pd.DataFrame.from_dict(file, orient='index').T
         57 
         58 
    
    ~\anaconda3\lib\site-packages\pandas\core\frame.py in from_dict(cls, data, orient, dtype, columns)
       1361             if len(data) > 0:
       1362                 # TODO speed up Series case
    -> 1363                 if isinstance(list(data.values())[0], (Series, dict)):
       1364                     data = _from_nested_dict(data)
       1365                 else:
    
    AttributeError: 'list' object has no attribute 'values'
    
[/code]


CC BY-SA 4.0
2021-09-14T13:10:11.367
82486
2021-09-14T16:35:24.090
47546
question
python pandas
辞書型のデータをdfに変換したいと考えている。


`https://jp-api.spooncast.net/sns/` から SNS の URL を取得することができます。  
ただ、ユーザ全員が URL を公表していないらしく、その様なユーザの場合は空欄にしています。  
※ 一人だけ、Twitter ではなく YouTube の URL になっています

[code]

    df = pd.concat(df).reset_index(drop=True)
    
    # ここから
    # SNS URL
    file = []
    for userid in df['id']:
      url = f'https://jp-api.spooncast.net/sns/{userid}'
      results = requests.get(url, headers=headers).json()['results']
    
      # SNS の URL を公表していない、もしくは持っていないユーザの場合、
      # results は空リストになっている
      Twitterurl = ''
      if results and 'sns_id' in results[0]:
        twitter = results[0]["sns_id"].replace('/@', '/')
        Twitterurl = f'https://{twitter}'
    
      file.append({
          'spoonURL': f'https://www.spooncast.net/jp/profile/{userid}/board?t=all',
        'TwitterURL': Twitterurl
      })
    
    # merge dataframes
    info = pd.concat([df, pd.DataFrame(file)], axis=1)
    info.index += 1
    
    print('csvファイル作成中')
    import csv
    csv_name = datetime.datetime.today().strftime("%Y%m%d%H%M")
    info.to_csv(csv_name + '.csv', quoting=csv.QUOTE_NONNUMERIC)
    
    print('Scraping終了')
    
[/code]

**実行結果(100ユーザの最初の10人)**

`print(info.to_markdown())`

| nickname | id | spoonURL | TwitterURL  
---|---|---|---|---  
1 | .ᴹkikutakeᴹ. | 313245000 |
<https://www.spooncast.net/jp/profile/313245000/board?t=all> |  
2 | さくら❍｡ | 314239954 |
<https://www.spooncast.net/jp/profile/314239954/board?t=all> |
<https://twitter.com/skr_spn>  
3 | アマ | 312201257 |
<https://www.spooncast.net/jp/profile/312201257/board?t=all> |  
4 | ྖᴷ❥⃝果奈 | 314049384 |
<https://www.spooncast.net/jp/profile/314049384/board?t=all> |  
5 | ⋆̩*̣̩のんちゃん | 311450944 |
<https://www.spooncast.net/jp/profile/311450944/board?t=all> |  
6 | マユミ⋆͛ᴿ  | 313448144 |
<https://www.spooncast.net/jp/profile/313448144/board?t=all> |
<https://twitter.com/spoon_mayumi>  
7 | ︎︎ ︎︎❧ ゆい «ᴸ☩ 専ⱽ» | 314035936 |
<https://www.spooncast.net/jp/profile/314035936/board?t=all> |  
8 | おまえ | 313979270 |
<https://www.spooncast.net/jp/profile/313979270/board?t=all> |  
9 | ダイボー◡̈*.。.ᴹ.*·̩͙ | 311808489 |
<https://www.spooncast.net/jp/profile/311808489/board?t=all> |  
10 | 凛 リン | 313766971 |
<https://www.spooncast.net/jp/profile/313766971/board?t=all> |
<https://twitter.com/Linhiiro>


CC BY-SA 4.0
2021-09-14T16:35:24.090
82488
2021-09-14T16:35:24.090
47127
82486
answer