🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1218閲覧

pythonおよびpandasを用いたリストのdataframe化ができません

taniisei

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/01/08 13:28

編集2021/01/09 01:39

前提・実現したいこと

私は、webスクレイピングの勉強をしております。現在、https://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11 のサイトから、更新時間、企業名、更新内容のタイトルを取得し、リスト化しようとしております。
このサイトは下にスクロールすると、’もっと見るボタン’があり、それをクリックするとさらにデータが表示されます。今回は練習として、15回程クリックして、そこに表示されたデータをリスト化し,そのデータをpandasを用いて、DataFrame化csvに書き出しをしようとしております。

現在、リスト化まではしております。printでは、データが表示されており、取得までできているのですが、そのデータをDataFrameにしようとすると、取得したデータがnoneとして出力されてしまいます。何が間違っているのかご教授いただけると幸いです。

■■な機能を実装中に以下のエラーメッセージが発生しました。

csvに出力する前に、DataFrameをprintしたターミナル結果

[['2021-01-09T10:02:46+0900'], {'found_datetime': ['2021-01-09T10:02:46+0900'], 'found_company': '\n 株式会社リアライズ\n ', 'found_title': '<魔法科高校の劣等生 来訪者編より、【魔法科高校の劣等生 来訪者編】司波深雪、七草真由美のパーカーが新発売>1月8日より予約販売開始!'}, ['2021-01-09T10:02:11+0900'], {'found_datetime': ['2021-01-09T10:02:11+0900'], 'found_company': '\n 株式会社リアライズ\n ', 'found_title': '<魔法科高校の劣等生 来訪者編より、【魔法科高校の劣等生 来訪者編】司波深雪 Ani-Art フルグラフィックTシャツが新発売>1月8日より予約販売開始!'}, ['2021-01-09T10:01:22+0900'], {'found_datetime': ['2021-01-09T10:01:22+0900'], 'found_company': '\n 株式会社リアライズ\n ', 'found_title': '<進撃の巨人より、進撃の巨人 メタルキーホルダー/エレン リヴァイが新発売>1月8日より予約販売開始!'}, ['2021-01-09T09:03:31+0900'], {'found_datetime': ['2021-01-09T09:03:31+0900'], 'found_company': '\n 大運株式会社\n ', 'found_title': '【マスクを着けてコロナ対策‼】ウイルス99%カットフィルターで徹底ブロック‼ 大好評の女性・こども用高品質不織布マスクが1月9日より特別価格の1箱(50枚入)345円‼お買い求めやすくなりました。'}, ['2021-01-09T09:00:00+0900'], {'found_datetime': ['2021-01-09T09:00:00+0900'], 'found_company': '\n カラフル株式会社\n ', 'found_title': '【日本最安値の51枚298円マスクでコロナ感染拡大を止めたい】2021人シェア買いで51枚入りマスクが1セット298円(税込/送料無料)!日本最安値!'},・・・・・ ・・・,['2020-12-22T11:00:05+0900'], {'found_datetime': ['2020-12-22T11:00:05+0900'], 'found_company': 'Shopify Japan 株式会社', 'found_title': '「Shopifyコマースアワード2020」開催決定~Shopifyパートナー企業を通じて1月末まで募集~'}, ['2020-12-22T11:00:05+0900'], {'found_datetime': ['2020-12-22T11:00:05+0900'], 'found_company': 'natural tech株式会社', 'found_title': '【原料〜製作までサプリの全てを公開!】温活もできる妊活葉酸サプリmitasがサイトリニューアル'}, ['2020-12-22T11:00:00+0900'], {'found_datetime': ['2020-12-22T11:00:00+0900'], 'found_company': '株式会社ベルーナ', 'found_title': '即おしゃれ見えで着こなしに差がつく、春先まで使える最旬コーディネート\u3000GeeRA 春のレイヤードコレクション\u3000 '}, ['2020-12-22T11:00:00+0900'], {'found_datetime': ['2020-12-22T11:00:00+0900'], 'found_company': 'クックパッド株式会社', 'found_title': 'クックパッドマート、ドラッグストア「スギ薬局」へ導入開始〜生鮮宅配ボックス「マートステーション」は331箇所まで拡大〜'}, ['2020-12-22T11:00:00+0900'], {'found_datetime': ['2020-12-22T11:00:00+0900'], 'found_company': 'Emma Sleep Japan合同会社\u3000\u3000\u3000\u3000', 'found_title': '20カ国、100万人以上が愛用するマットレス 睡眠先進国ドイツ発 エマ・スリープ 12月22日、日本上陸'}] 0 1 2 0 2021-01-09T10:02:46+0900 None None 1 found_datetime found_company found_title 2 2021-01-09T10:02:11+0900 None None 3 found_datetime found_company found_title 4 2021-01-09T10:01:22+0900 None None ... ... ... ... 1275 found_datetime found_company found_title 1276 2020-12-22T11:00:00+0900 None None 1277 found_datetime found_company found_title 1278 2020-12-22T11:00:00+0900 None None 1279 found_datetime found_company found_title [1280 rows x 3 columns]

該当のソースコード

python

1#ライブラリのimport 2from bs4 import BeautifulSoup 3import urllib.request as req 4import pandas as pd 5from selenium import webdriver 6import chromedriver_binary 7import datetime 8from datetime import date 9from datetime import timedelta 10import time 11import numpy as np 12 13#googlechromeを起動 14browser = webdriver.Chrome() 15#chromeドライバーが見つかるまでの待ち時間を設定 16browser.implicitly_wait(3) 17 18#ページサイトへアクセス 19 20#urlの指定 21url = 'https://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11' 22#指定したurlへ遷移する 23browser.get(url) 24 25#urlへ遷移する前に下の処理に行かないための記述 26time.sleep(3) 27 28x = 1 29while x <= 15: 30 #クリックの動作を入力 31 #find_element_by_idはhtmlのidの要素を指定して入力できる 32 browser_from = browser.find_element_by_id('more-load-btn-view') 33 time.sleep(3) 34 browser_from.click() 35 print('クリックしました') 36 x = x + 1 37 38#指定したウェブサイトのhtmlを取得する 39##response = req.urlopen(url) 40 41##parse_html = BeautifulSoup(response, 'html.parser') 42##parse_html 43 44#ボタンクリック後、この部分で「urllib.request」を使用してHTMLを再取得しているので、Ajax取得したHTMLが取れてません。urllibは静的なHTML取得にしか使えません。 45#以下のようにAjax後のレスポンスを待ってからSeleniumドライバからHTMLを取得したらどうでしょうか。 46# ~ボタンクリック後 47 48time.sleep(3) 49parse_html = BeautifulSoup(browser.page_source, 'html.parser') 50 51#aタグの一覧から複数のクラス名を[]で指定して取得する 52found_lists = parse_html.find_all('article' ,class_= 'item item-ordinary') 53 54 55 56found_articles = [] 57 58for article in found_lists: 59 datetime = article.find('time', class_='time-release time-release-ordinary icon-time-release-svg') 60 found_datetime = datetime['datetime'] 61 found_articles.append(found_datetime.split()) 62 found_company_a = article.find('a', class_='link-name-company name-company name-company-ordinary') 63 found_company =found_company_a.text 64 found_title_a =article.find('a', class_='link-title-item link-title-item-ordinary') 65 66 67 68 69 70 article={ 71 'found_datetime':found_datetime.split(), 72 'found_company':found_company_a.contents[0], 73 'found_title':found_title_a.contents[0] 74 } 75 found_articles.append(article) 76#------------------------------------------------------------- 77print(found_articles) 78 79#データフレームにデータを書き出す。 80df_found = pd.DataFrame(found_articles) 81 82#欠損値を除く 83df_notnull = df_found.dropna(how = 'any') 84df_notnull 85 86#csvへの書き込み 87df_found.to_csv('output_02.csv')

試したこと

pandasを用いて、datafreme化

補足情報(FW/ツールのバージョンなど)

Python 3.6.0 lxml4.6.2 pandas0.25.3 datetime
ここにより詳細な情報を記載してください。
変換したいデータを取得したホームページ https://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11 (注:これは、スクレイピングの練習のために、書いているコードなので、データ自体はなんでも構いません
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/01/08 13:51

print(found_articles)の結果はどうなっていますか?
ppaul

2021/01/08 14:24

print(df_found)を見ると、沢山のNaNが見つかるような気がします。
taniisei

2021/01/09 01:40

ご回答ありがとうございます。print(found_articles)の結果を上下5データずつ表示させていただきます。 文字数の関係上全て表示できず申し訳ございません。
guest

回答1

0

ベストアンサー

printでは、データが表示されており、取得までできているのですが、そのデータをDataFrameにしようとすると、取得したデータがnoneとして出力されてしまいます。

DataFrameの元なるリストを修正する必要があるかと思います。下記のような方法はどうでしょうか?

python

1import pandas as pd 2 3l = [['2021-01-09T10:02:46+0900'], {'found_datetime': ['2021-01-09T10:02:46+0900'], 'found_company': '\n 株式会社リアライズ\n ', 'found_title': '<魔法科高校の劣等生 来訪者編より、【魔法科高校の劣等生 来訪者編】司波深雪、七草真由美のパーカーが新発売>1月8日より予約販売開始!'}, ['2021-01-09T10:02:11+0900'], {'found_datetime': ['2021-01-09T10:02:11+0900'], 'found_company': '\n 株式会社リアライズ\n ', 'found_title': '<魔法科高校の劣等生 来訪者編より、【魔法科高校の劣等生 来訪者編】司波深雪 Ani-Art フルグラフィックTシャツが新発売>1月8日より予約販売開始!'}] 4l2 = [l[i] for i in range(1, len(l), 2)] 5 6df = pd.DataFrame(l2) 7print(df) 8#found_datetime found_company found_title 9#0 [2021-01-09T10:02:46+0900] \n 株式会社リアライズ\n <魔法科高校の劣等生 来訪者編より、【魔法科高校の劣等生 来訪者編】司波深雪、七草真由美のパ... 10#1 [2021-01-09T10:02:11+0900] \n 株式会社リアライズ\n <魔法科高校の劣等生 来訪者編より、【魔法科高校の劣等生 来訪者編】司波深雪 Ani-Art...

投稿2021/01/09 07:15

meg_

総合スコア10736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/01/09 07:17

細かい部分の修正は質問者自身でお願いします。
taniisei

2021/01/09 09:55

回答ありがとうございます。 出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問