質問: PythonにてWebスクレイピングを行っているのですが、一文の中に絵文字、特殊記号(♡など)のいずれかが混じっており、どちらの場合でも削除したいと思っております。 というのも、スクレイピングで取得したデータをCSVに出力する際に、エラーが起きてしまいます。 絵文字の削除については、 https://qiita.com/yoshimo123/items/85331d881aed9ad41020 ↑こちらを参考にして成功しました。 絵文字があった場合でも、それを削除してCSVに書き出せるようにしてはいたのですが、 今度は特殊文字(今回はハート[環境依存文字])があったためか、以下のエラーが起こります。 UnicodeEncodeError: 'cp932' codec can't encode character '\u2661' in position 91: illegal multibyte sequence コード(一部省略)は以下のような形です。 ``` (前略) # 絵文字の削除 def remove_emoji(stc_str): return ''.join(c for c in stc_str if c not in emoji.UNICODE_EMOJI) # メイン処理 def scraping() with open("output.csv", "w") as f: ##### データ取得処理(省略) ##### # CSV書き出し f.write(remove_emoji(data1[count]) + "," data2[count] "\n") count += 1 scraping() ``` このプログラムに、特殊記号を削除する処理を追加しました。 https://codeday.me/jp/qa/20190227/317129.html https://hacknote.jp/archives/19937/ ↑これらのサイトを参考に(というかほぼそのまんまですが)して、 ``` # 特殊記号の除去 def remove_specialcode(text): unicodedata.normalize("NFKD", text).encode("ascii", "ignore") #データ取得の処理のところで、 data1.append(remove_specialcode(str.get_text())) # CSV書き出し f.write(remove_emoji(data1[count]) + "," data2[count] "\n") count += 1 ``` このようにすると、以下のようなエラーが起きてしまいます。 TypeError: 'NoneType' object is not iterable おそらく文字コードの問題なのかと思うのですが、正直なところ全くと言っていいほどわからないため、 申し訳ないですが、教えていただきたいです。 絵文字と特殊記号の両方を削除したうえで、CSVを出力させたいと思っております。 ご教示の程よろしくお願い致します。
回答: `open("output.csv", "w")`のときに`open("output.csv", "w", errors="ignore")`とすれば、とりあえずshift-jisに変換できないコードは除去してくれるんじゃないでしょうか。 https://docs.python.org/ja/3/library/functions.html#open 下の方のコードは全体的に「すごくへん」です。 ``` # 特殊記号の除去 def remove_specialcode(text): unicodedata.normalize("NFKD", text).encode("ascii", "ignore") # ↑日本語だろうにasciiにしちゃっていいのか。いや、それ以前に返り値をどこにも入れてないから無意味 #データ取得の処理のところで、 data1.append(remove_specialcode(str.get_text())) # ↑strってなんですか。どうして再帰しているのですか。再帰したとして、この関数はreturn文なさそうなのでNoneが返るんじゃないでしょうか # CSV書き出し f.write(remove_emoji(data1[count]) + "," data2[count] "\n") count += 1 # 文字列結合演算子の+がいくつか足りない気がする...... ``` まだPythonに(あるいはプログラミングに)不慣れな方なのだと思います。ある程度思い通りに書けるようになるまでは、努力が要ります。勉強しましょう。 あと、コピペで継ぎ接ぎを重ねていくと最終的にとんでもないコードが出来上がるので、特に不慣れなうちはできるだけ全体を自分で書いた方が良いです。 そしてそういう状態のものに対する助言を他人に求めても、「なんだこのマキ○ソ」みたいな反応されますので、自分で綺麗にするしかないことが多いです。 意味わからないものは打ち込むな、が基本。