前提・実現したいこと
計量テキスト分析の前準備として、htmlファイルからテキストをスクレイピングしたいと思っています。
(質問の詳細)
PythonのBeautifulSoupを使用して、PCに保存されたローカルなhtmlファイル(本文はフランス語)からテキストを抽出するプログラムを実装したいのですが、以下のようなエラーコードが表示されます。
発生している問題・エラーメッセージ
エンコーディングの関連のエラーと思われます。
Traceback (most recent call last): File "lemonde_test.py", line 4, in <module> with codecs.open(filepath, 'utf-8', 'ignore') as f: File "/Users/hankechi78/.pyenv/versions/3.8.2/lib/python3.8/codecs.py", line 905, in open file = builtins.open(filename, mode, buffering) ValueError: invalid mode: 'utf-8b'
該当のソースコード
Python
1import codecs 2 3filepath = 'integrated2010_2020.html' 4with codecs.open(filepath, 'utf-8', 'ignore') as f: 5 html = f.read() 6 7from bs4 import BeautifulSoup 8soup = BeautifulSoup(html, 'html.parser') 9 10text = soup.get_text() 11 12print(text) 13
試したこと
(1)解析不能な文字列を無視するべくcodecsを試したのですが、引き続き原因不明のエラーが発生します。
(2)「ValueError: invalid mode: 'utf-8b'」で検索をかけましたが有用な情報が得られませんでした(そもそも'utf-8b'の'b'が何なのか調べてもよくわかりませんでした)。
(3)フランス語はutf-8かutf-16との情報を見かけたので、utf-16でも試しましたが同じエラーコードが発生しました。
補足情報(FW/ツールのバージョンなど)
Mac OS, python 3.8.2です。
今回のエラーと関係あるかわかりませんが、元々webarchive形式だったものをtextutilコマンドでhtml形式に変換し、スクレイピングを試みています。
以下に問題のhtmlファイルの抜粋を掲載いたします。
(なお、エラーコードにある「905行目」は、同ファイルの905行目を指しているとすれば、以下のような形式です。
<以下、抜粋>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <title></title> <meta name="Generator" content="Cocoa HTML Writer"> <meta name="CocoaVersion" content="1894.6"> <style type="text/css"> p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Arial; color: #000000; -webkit-text-stroke: #000000} <中略> p.p23 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; line-height: 18.0px; font: 12.0px Arial; color: #262626; -webkit-text-stroke: #262626} span.s1 {font-kerning: none} <中略> span.s13 {font-kerning: none; background-color: #000000; text-shadow: 0.0px 0.0px 2.0px rgba(128, 128, 128, 0.5)} td.td1 {width: 80.0px; margin: 0.5px 0.5px 0.5px 0.5px; padding: 1.0px 1.0px 1.0px 1.0px} <中略> td.td16 {width: 128.3px; margin: 0.5px 0.5px 0.5px 0.5px; padding: 1.0px 1.0px 1.0px 1.0px} </style> </head> <body> <p class="p1"><span class="s1"><img src="file:///Docviewer.aspx.gif" alt="Docviewer.aspx.gif"></span></p> <p class="p2"><span class="s1">Le Monde<span class="Apple-converted-space"> </span></span></p> <p class="p1"><span class="s1">International, jeudi 30 juillet 2020 711 mots, p. 3<span class="Apple-converted-space"> </span></span></p> <p class="p3"><span class="s1">International<span class="Apple-converted-space"> </span></span></p> <p class="p4"><span class="s2"><b>Aussi paru dans</b></span></p> <table cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" class="td1"> <p class="p4"><span class="s3">28 juillet 2020</span></p> </td> <td valign="top" class="td2"> <p class="p4"><span class="s3">-<span class="Apple-converted-space"> </span></span></p> </td> <td valign="middle" class="td3"> <p class="p5"><span class="s1">Le Monde (site web)</span></p> </td> </tr> <tr> <td valign="top" class="td1"> <p class="p4"><span class="s3">29 juillet 2020</span></p> </td> <td valign="top" class="td2"> <p class="p4"><span class="s3">-<span class="Apple-converted-space"> </span></span></p> </td> <td valign="middle" class="td3"> <p class="p5"><span class="s1">La Matinale du Monde</span></p> </td> </tr> </tbody> </table> <p class="p6"><span class="s1"><b>L'euthanasie d'une malade incurable relance un débat national au </b></span><span class="s4"><b>Japon</b></span></p> <p class="p3"><span class="s1">Deux médecins avaient reçu de l'argent peu avant le décès, selon la police</span></p> <p class="p1"><span class="s1">Philippe Mesmer</span></p> <p class="p7"><span class="s1">Tokyo correspondance - L'arrestation de deux médecins soupçonnés d'avoir aidé à mourir une femme atteinte de la maladie de Charcot (la sclérose latérale amyotrophique) relance le débat sur l'euthanasie au </span><span class="s4">Japon</span><span class="s1">. La police a révélé, lundi 27 juillet, que les praticiens avaient reçu 1,3 million de yens (environ 10 500 euros) de Yuri Hayashi, 51 ans, quelques jours avant son décès en novembre 2019. Un sédatif a été retrouvé dans le corps de la femme. Accusés de meurtre, les deux médecins ont été arrêtés le 23 juillet.<span class="Apple-converted-space"> </span></span></p> <以下略>回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/01 00:33
2020/08/01 17:20
2020/08/02 00:01