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

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

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

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

Python

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

Q&A

解決済

1回答

1403閲覧

wordcloudを使って単語を出力したいです。

jury_new

総合スコア31

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2020/05/24 09:56

前提・実現したいこと

wordcloudを使って単語を出力したいです。
基本的な形はこのようになっていると推測したのですが。
下記のエラーが出てしまいました。
font_pathをコードの中にある記述があり、
これは日本語を出力するために追加するコード?
と考えたのですが、詳細について調べても理解できませんでした。
そもそもfont_pathがエラーの原因かについては分かりませんがそう考えました。

エラーの詳細に関しては、予期せぬ~~~があるために出力の邪魔をしていると考えています。
上記の自分のfont_pathの推測があっているとするならばつながってくるのではないかと。。。

ただ、はっきりと何が原因かわからないためご教示お願いします。

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

Traceback (most recent call last): File "wiki_new.py", line 64, in <module> wordcloud.generate(person) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/wordcloud/wordcloud.py", line 631, in generate return self.generate_from_text(text) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/wordcloud/wordcloud.py", line 612, in generate_from_text words = self.process_text(text) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/wordcloud/wordcloud.py", line 574, in process_text words = re.findall(regexp, text, flags) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/re.py", line 239, in findall return _compile(pattern, flags).findall(string) TypeError: expected string or bytes-like object

該当のソースコード

python

1def elsepe(): 2 for per in all: 3 for two in all.find_all('tr'): 4 for three in two.find_all('td'): 5 un = three.get_text(strip=True) 6 for more in three.select('a'): 7 new_type = more.get_text(strip=True) 8 one = re.sub('[0-9年平成昭和令和明治大正]','',new_type) 9 show = print(one) 10 return show 11 12person = [] 13person.append(elsepe()) 14 15wordcloud = WordCloud(width=480,height=320) 16 17#エラーが出ている行は下記の行です。 18wordcloud.generate(person) 19wordcloud.to_file('wordcloud.png')

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

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

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

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

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

guest

回答1

0

ベストアンサー

def elsepe(): for per in all: for two in all.find_all('tr'): for three in two.find_all('td'): un = three.get_text(strip=True) for more in three.select('a'): new_type = more.get_text(strip=True) one = re.sub('[0-9年平成昭和令和明治大正]','',new_type) show = print(one) return show

下から2行目でprint関数を代入し、最終的に返しているのが原因ではないでしょうか。

generate関数には、テキストを渡す必要があるため、

def elsepe(): show = '' for per in all: for two in all.find_all('tr'): for three in two.find_all('td'): un = three.get_text(strip=True) for more in three.select('a'): new_type = more.get_text(strip=True) one = re.sub('[0-9年平成昭和令和明治大正]','',new_type) print(one) show += ' ' + str(one) return show # ~略~ # wordcloud.generate(person) ←これを以下のように修正 wordcloud.generate('\n'.join(person))

とすればよいのではないでしょうか。

投稿2020/05/24 10:23

編集2020/05/24 12:25
patapi

総合スコア820

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

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

jury_new

2020/05/24 11:30

taizan205さん、ご回答ありがとうございます! ご指摘頂いた通り、strでテキストに変換しましたがエラーが出ている行及びエラーの内容は変化はありませんでした。
patapi

2020/05/24 12:26

追加で、 wordcloud.generate(person)  を wordcloud.generate('\n'.join(person)) に修正した場合はどうでしょうか?
jury_new

2020/05/24 13:58

変化がありました!エラーが消え画像が作成されました! お時間があれば今回なぜエラーが解消したのかについてお聞かせいただけないでしょうか? しつこく何度も申し訳ありません。 また、申し訳ありません。ここからは今回の質問とは少し離れてしまうのですが、お時間があればご回答お願い致します。エラーは消え画像が作成されたのですが、日本語だからでしょうか、文字化けをしてしまっております。こちらを解決するためには上記で少し触れたのですが、font_pathが関係しているのでしょうか?こちらも解決へのアドバイスを一言頂けると幸いです。
patapi

2020/05/24 14:59

> 今回なぜエラーが解消したのか generate関数には文字列を渡さなければいけませんが、 personはリストです。 最初の状態では wordcloud.generate(person)というように 文字列ではなく、リストであるpersonそのものをgenerate関数に渡してしまっていたため、エラーになっていました。 「'\n'.join(person)」とすることにより、リストpersonの中にある複数の文字列を、一つの文字列にすることができます。 person=['あ','い','う']となっている場合、 '\n'.join(person) は 「'あ\nい\nう"」に変換されます 結果、generate関数に文字列を渡したため、正常にワードクラウドを生成できます。 ## 文字化けの件ですが、 https://ipafont.ipa.go.jp/old/ipafont/download.html の、一番下の、ipagp00303.zip(4.09 MB)というリンクで、 ipagp00303.zipというファイルをダウンロードし、 zipファイルを展開して、ipagp.ttfというファイルを取り出してください。 ipagp.ttfを今回のPythonスクリプトがあるフォルダと同じ場所にコピーして wordcloud = WordCloud(width=480, height=320) という部分を以下のように修正してください。 ↓ wordcloud = WordCloud(width=480, height=320, font_path="./ipagp.ttf")
jury_new

2020/05/24 15:19

丁寧なご返答ありがとうございます! 無事完成しました! なるほど!!リストでエラーが起きていたんですね、これから気をつけます。 文字化けについてはダウンロードが必要だったんですね、、調べていてそれぞれ指定しているパスが違った理由がはっきりしてすっきりしました。本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問