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

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

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

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

Q&A

解決済

1回答

12482閲覧

Pythonにて絵文字と特殊記号を削除したいです。

umai29

総合スコア19

スクレイピング

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

0グッド

0クリップ

投稿2019/06/18 15:47

PythonにてWebスクレイピングを行っているのですが、一文の中に絵文字、特殊記号(♡など)のいずれかが混じっており、どちらの場合でも削除したいと思っております。

というのも、スクレイピングで取得したデータをCSVに出力する際に、エラーが起きてしまいます。

絵文字の削除については、
https://qiita.com/yoshimo123/items/85331d881aed9ad41020
↑こちらを参考にして成功しました。

絵文字があった場合でも、それを削除してCSVに書き出せるようにしてはいたのですが、
今度は特殊文字(今回はハート[環境依存文字])があったためか、以下のエラーが起こります。

UnicodeEncodeError: 'cp932' codec can't encode character '\u2661' in position 91: illegal multibyte sequence

コード(一部省略)は以下のような形です。

Python

1(前略) 2# 絵文字の削除 3def remove_emoji(stc_str): 4 return ''.join(c for c in stc_str if c not in emoji.UNICODE_EMOJI) 5 6# メイン処理 7def scraping() 8 with open("output.csv", "w") as f: 9 10 ##### データ取得処理(省略) ##### 11 12 # CSV書き出し 13 f.write(remove_emoji(data1[count]) + "," data2[count] "\n") 14 count += 1 15 16scraping()

このプログラムに、特殊記号を削除する処理を追加しました。

https://codeday.me/jp/qa/20190227/317129.html
https://hacknote.jp/archives/19937/

↑これらのサイトを参考に(というかほぼそのまんまですが)して、

Python

1# 特殊記号の除去 2def remove_specialcode(text): 3 unicodedata.normalize("NFKD", text).encode("ascii", "ignore") 4 5 #データ取得の処理のところで、 6 data1.append(remove_specialcode(str.get_text())) 7 8 # CSV書き出し 9 f.write(remove_emoji(data1[count]) + "," data2[count] "\n") 10 count += 1 11

このようにすると、以下のようなエラーが起きてしまいます。

TypeError: 'NoneType' object is not iterable

おそらく文字コードの問題なのかと思うのですが、正直なところ全くと言っていいほどわからないため、
申し訳ないですが、教えていただきたいです。

絵文字と特殊記号の両方を削除したうえで、CSVを出力させたいと思っております。

ご教示の程よろしくお願い致します。

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

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

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

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

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

yumetodo

2019/06/18 19:12

csvの文字コードをcp932にしているようですが、UTF-8ではだめなのですか?それが一番手っ取り早く確実だと思うのですが
umai29

2019/06/19 13:54

ありがとうございます。 たしかに、と文字コードに関するエラーが起きた際に、cp932と表示されましたので、おそらくそれが原因なのかなと薄々と気づいてはいましたが…明確にどのように対処すればよかったかがわかりませんでした。 今回はhayataka2049さんに教えていただいた内容で解決できましたが…プログラムのどこかでUTF-8に変換する処理をすれば良いのですね。またの機会に試してみます。ありがとうございます。
yumetodo

2019/06/20 10:23

今どきShift-JIS(cp932)で扱わざるを得ない状況ってかなり限定的で(Windowsですらメモ帳のデフォルトの文字コードがUTF-8になる時代だしWebページの90%以上はUTF-8が使われている時代、C++という低級操作も書ける言語ですらC++20でchar8_t型というUTF-8な文字型を追加する時代)、さらに他の文字コードを扱わざるを得ない場合でもUnicodeのいずれかのエンコード(UTF-8/16/32)を介して扱う時代だということを押さえておくと良いと思います。
umai29

2019/06/20 12:19

詳しい情報ありがとうございます。 全体的に勉強不足なので、こういった背景も勉強して知識を深めていきたいと思います。
guest

回答1

0

ベストアンサー

open("output.csv", "w")のときにopen("output.csv", "w", errors="ignore")とすれば、とりあえずshift-jisに変換できないコードは除去してくれるんじゃないでしょうか。

https://docs.python.org/ja/3/library/functions.html#open

下の方のコードは全体的に「すごくへん」です。

python

1# 特殊記号の除去 2def remove_specialcode(text): 3 unicodedata.normalize("NFKD", text).encode("ascii", "ignore") 4 # ↑日本語だろうにasciiにしちゃっていいのか。いや、それ以前に返り値をどこにも入れてないから無意味 5 6 #データ取得の処理のところで、 7 data1.append(remove_specialcode(str.get_text())) 8 # ↑strってなんですか。どうして再帰しているのですか。再帰したとして、この関数はreturn文なさそうなのでNoneが返るんじゃないでしょうか 9 10 # CSV書き出し 11 f.write(remove_emoji(data1[count]) + "," data2[count] "\n") 12 count += 1 13 # 文字列結合演算子の+がいくつか足りない気がする……

まだPythonに(あるいはプログラミングに)不慣れな方なのだと思います。ある程度思い通りに書けるようになるまでは、努力が要ります。勉強しましょう。


あと、コピペで継ぎ接ぎを重ねていくと最終的にとんでもないコードが出来上がるので、特に不慣れなうちはできるだけ全体を自分で書いた方が良いです。

そしてそういう状態のものに対する助言を他人に求めても、「なんだこのマキ○ソ」みたいな反応されますので、自分で綺麗にするしかないことが多いです。

意味わからないものは打ち込むな、が基本。

投稿2019/06/19 00:01

編集2019/06/19 00:10
hayataka2049

総合スコア30933

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

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

umai29

2019/06/19 13:43

ご回答ありがとうございます。 おっしゃる通り、Pythonのコーディングは最近始めたばかりで、まだまだ不慣れです。便利だなと思うこともありますが、インデントにも戸惑うことが多々あります。 open("output.csv", "w", errors="ignore")に変更したことで、問題は解決できました! ありがとうございます! 上記のソースコードにも数々のご指摘ありがとうございます。 return すらつけ忘れてしまっていました。あと、一部省略したためか、全体的に意味不明なコードになってしまいました。ダメダメです。 もっと勉強しないといけないですね。頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問