質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

pandas

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

Q&A

解決済

1回答

475閲覧

Python の TypeError を解消したい

observer_meow

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

pandas

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

0グッド

0クリップ

投稿2023/01/03 23:29

編集2023/01/04 01:46

前提

Twitter の Progress Bar 2023 (@ProgressBar202_) のツイートを解析しようとしています。以下の形式でツイートの情報を取得しました。

Python

1tweets = [ 2 "Progress Bar 2023\n@ProgressBar202_\n·\n2023年1月1日\n2023 is 1% complete.\n1,865\n7.7万\n61.3万", 3 "Progress Bar 2023\n@ProgressBar202_\n·\n2023年1月1日\n2022 is 100% complete.\n902\n5.9万\n50.5万", 4 "Progress Bar 2023\n@ProgressBar202_\n·\n2022年12月28日\n2022 is 99% complete.\n1,083\n4.8万\n28.2万", 5 "Progress Bar 2023\n@ProgressBar202_\n·\n2022年12月25日\n2022 is 98% complete.\n577\n2.1万\n19.9万", 6... 7]

↑のデータのフル版はこちらに貼っておきます。

実現したいこと

先ほど取得した情報を regex で整形し、pandas で表にしようと試みました。以下のコードの通りです。

Python

1import re 2import pandas as pd 3 4table = {"year": [], "percent": [], "reply": [], "RT": [], "fab": []} 5def parse(x): 6 if x[-1] == "万": 7 return int(float(x[:-1]) * 10000) 8 elif "," in x: 9 return int(x.replace(",","")) 10 else: 11 return int(x) 12 13for tw in tweets: 14 m = re.search(r"(\d+).* is (\d+)%.*\n(.*)\n(.*)\n(.*)", tw) 15 table["year"].append(int(m[1])) 16 table["percent"].append(int(m[2])) 17 table["reply"].append(parse(m[3])) 18 table["RT"].append(parse(m[4])) 19 table["fab"].append(parse(m[5])) 20 21df = pd.DataFrame(table)

それを以下のコードで可視化したいと思っています。

Python

1plt.figure(figsize=(15, 10)) 2plt.subplot(2,1,1) 3for year in [2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023]: 4 data = df[df.year == year].sort_values("percent") 5 plt.plot(data.percent, data.RT, ".-", label="%d"%year) 6plt.legend() 7plt.xlabel("%") 8plt.xticks(range(0, 101, 10)) 9plt.title("# of RTs") 10plt.subplot(2,1,2) 11for year in [2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023]: 12 data = df[df.year == year].sort_values("percent") 13 plt.plot(data.percent, data.fab, ".-", label="%d"%year) 14plt.legend() 15plt.xlabel("%") 16plt.xticks(range(0, 101, 10)) 17plt.title("# of fabs") 18plt.show()

発生している問題・エラーメッセージ

先ほどのコードを実行すると、

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-3-840e886fa9d8> in <module> 13 for tw in tweets: 14 m = re.search(r'(\d+).* is (\d+)%.*\n(.*)\n(.*)\n(.*)', tw) ---> 15 table["year"].append(int(m[1])) 16 table["percent"].append(int(m[2])) 17 table["reply"].append(parse(m[3])) TypeError: 'NoneType' object is not subscriptable

とエラーメッセージが出ます。

試したこと

m の型を確認したところ、NoneType であることはわかっています。 Stack Overflow 等確認してみましたが解決策等見つけることはできませんでした。皆さんのお力添えをよろしくお願いします。

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

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

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

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

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

poto568

2023/01/04 00:56

tweetsの4行目の577の前にnが抜けてませんか
observer_meow

2023/01/04 01:03

ご指摘ありがとうございます。改善いたしました。 ですが、同じエラーメッセージが表示されます。
yuma.inaura

2023/01/04 01:14

質問にあるデータだとエラーが発生しないですよね 問題が再現できる情報を載せてみませんか
observer_meow

2023/01/04 01:20

コメントありがとうございます `"Progress Bar 2023\n@ProgressBar202_\n·\n2020年1月1日\n2019 is 100% complete! Thank you for following. Have a nice 2020!\n1,034\n5万\n18.6万"` など、少し違ったツイートもあるので一旦統一してみます。
observer_meow

2023/01/04 01:28

情報を追加いたしました。
guest

回答1

0

ベストアンサー

質問中では省略されていますがtweetsの中に正規表現にマッチしないデータがあるのでは?

投稿2023/01/04 01:14

yuma.inaura

総合スコア1453

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

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

observer_meow

2023/01/04 01:29

その可能性が高そうです。その箇所を探してみます。
observer_meow

2023/01/04 01:53

リプライが0のものは\n0と表示されずに、それそのものが存在しないとしてカウントされていました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問