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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

3035閲覧

shift-jisのhtmlをbeautiful soupで分析したい

退会済みユーザー

退会済みユーザー

総合スコア0

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

0クリップ

投稿2021/11/24 16:41

編集2021/11/25 02:25

#環境
mac, anaconda

#行いたいこと
ローカルにあるhtmlファイルをbeautifulsoupに渡したい。

python

1from bs4 import BeautifulSoup as bs 2 3file1 = "/Users/**/Desktop/**/**.htm" 4soup = bs(open(file1),'lxml')

#エラーコード
'utf-8' codec can't decode byte 0x82 in position 364: invalid start byte

#試したことなど
他のhtmlファイルは無事,分析できたのですが,その違いは文字コードがutf-8かshift-jisかの違いでした。
そこで,openの引数に"encoding="Shift-JIS"と指定したのですが,同様のエラーが出てしまいました。
また,soupの引数にfrom_encording=で指定してみたのですが,それも同様のエラーが出ました。

#教えていただきたいこと
beautifulsoupで,shift-jisのhtmlを解析する方法を教えていただきたいです。色々と調べてはみたのですが,どのようにやってもエラーが出てしまいます。
もしくは,shift-jisのhtmlをutf-8を変換する方法を教えていただきたいです。こちらも調べてはみたのですが,実装には至りませんでした。

#追加・補充
以下のコードを試したところ,同様のエラーが出てしまいました。

soup = bs(open(file1, 'rb').read().decode('Shift-JIS'), 'lxml')

'shift_jis' codec can't decode byte 0x87 in position 2020: illegal multibyte sequence

melian👍を押しています

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

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

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

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

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

melian

2021/11/24 17:54

soup = bs(open(file1, 'rb').read().decode('Shift-JIS'), 'lxml') を実行すると、どうなりますでしょうか?
退会済みユーザー

退会済みユーザー

2021/11/25 02:23

追記依頼,ありがとうございます。 追記しましたとおり,同様のエラーが出てしまいました。
melian

2021/11/25 02:34

ありがとうございます。 illegal byte が 0x87 であれば、 soup = bs(open(file1, 'rb').read().decode('shift_jisx0213'), 'lxml') でデコードできるかもしれません。時間があれば試してみて下さい。
退会済みユーザー

退会済みユーザー

2021/11/25 02:43

ありがとうございます!デコードできました!! 大変恐縮ですが,さらに1つお伺いしたいことがあります。 手元のフォルダに並んでいるhtmlファイルは,utf-8とshiht-jisが混在しているようで,for文で分析を回す際に,それぞれのファイルの文字コードを取得して,それに対応する形でsoupを作成すると言ったようなことは実装できますでしょうか?
melian

2021/11/25 02:47

実装は可能なのですが、少し面倒なので(苦笑)、元の html ファイルの文字コードを utf-8 に一括変換する方が良いのかな、と思います。html ファイルの文字コードは現状のままでないとまずいのでしょうか?
退会済みユーザー

退会済みユーザー

2021/11/25 02:55

そうなのですね。 現状のままでなくても全く問題ありません。一応,web上のフリーツールを使って変換してみたところ,うまく読み込むことができました。全てのファイルでバックアップも取ってあるので,ぜひ一括変換の方法も教えていただきたいです。 何卒,よろしくお願いいたします。
melian

2021/11/25 03:03

私は Linux を常用していて Windows はほとんど使ったことがないのですが、Linux ではファイルの文字コードを変換するコマンドが幾つかあって、バッチ処理的に一括変換する事ができます。Windows をお使いなのでしたら、一括変換の方法を新規の質問として投稿してみてはどうでしょうか。それと、注意点として html ファイルの内の メタタグで指定している charset も UTF-8 に変更する必要があるかと思います。
退会済みユーザー

退会済みユーザー

2021/11/25 03:10

ありがとうございます。自分は,macなのでmac環境におけるコマンドを調べた上で,わからなかったら新規の質問として投稿しようと思います。 改めて,ご丁寧な回答をありがとうございました。ベストアンサーにさせていただきたいので,よろしければご回答を行っておいていただけると幸いです。
guest

回答2

0

ベストアンサー

以下のコードを試したところ,同様のエラーが出てしまいました。

soup = bs(open(file1, 'rb').read().decode('Shift-JIS'), 'lxml')

'shift_jis' codec can't decode byte 0x87 in position 2020: illegal multibyte sequence

文字コードの指定を shift_jisx0213 にする事でデコードが可能になります。

python

1soup = bs(open(file1, 'rb').read().decode('shift_jisx0213'), 'lxml') 2 3# 試してはいないのですが、おそらく `open()` で指定しても同じかと思います 4soup = bs(open(file1, encoding='shift_jisx0213'), 'lxml')

投稿2021/11/25 03:19

melian

総合スコア19805

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

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

0

openの引数に"encoding="Shift-JIS"と指定したのですが,

でいいはずです。正しくは"Shift_JIS"ですが。

なお、"lxml"ではShift_JISのままでは、from_encoding="Shift_JIS"と指定してもちゃんと扱えないようです。"html.parser"ならOKのはず。
参考:https://teratail.com/questions/368173

投稿2021/11/24 17:09

otn

総合スコア84559

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

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

退会済みユーザー

退会済みユーザー

2021/11/25 02:30

ご回答ありがとうございます。openの引数に指定した場合は,質問中のエラーが出てしまいました。 回答者様のご指摘を踏まえて,パーサを変えて "soup = bs(open(file1),from_encoding="Shift_JIS","html.parser")" を実行したところ, "positional argument follows keyword argument" というエラーが出てしまいました。エラーの意味自体は分かるのですが,どうも直し方がわかりません。 よろしければ,ご教授願いたいです。
otn

2021/11/25 03:39

> openの引数に指定した場合は,質問中のエラーが出てしまいました。 Shift_JISを正しく指定していれば、「'utf-8' codec can't decode」というエラーは出るはずがないので、何かの勘違いとか、エラーメッセージのコピペミスとかがあると思われます。 > "positional argument follows keyword argument" というエラーが出てしまいました。 書いてある通りで、位置パラメーター"mtml.parser"は、キーワードパラメーターfrom_encoding="Shift_JIS" の後ろに書くことは出来ません。第二引数です。 また、 > 'shift_jis' codec can't decode byte 0x87 in position 2020: illegal multibyte sequence というエラーが出ていることからすると、ページは純粋なShift_JISでなく、MS拡張の文字が入っているので、from_encoding="cp932" にしましょう。cp932というのがWindowsで使われているShift_JISの拡張版です。
退会済みユーザー

退会済みユーザー

2021/11/25 04:36

ご回答ありがとうございました。今回は,もう1人の方の回答で解決したのでそちらをBAにさせていただきました。 改めて,ご回答ありがとうございました。
otn

2021/11/25 04:38

> Shift_JISを正しく指定していれば、「'utf-8' codec can't decode」というエラーは出るはずがないので、何かの勘違いとか、エラーメッセージのコピペミスとかがあると思われます。 はどうだったのでしょうか?
退会済みユーザー

退会済みユーザー

2021/11/25 06:15

すみません,その点に対するご返信を失念しておりました。 自分の「同様に」という言葉が曖昧だったのですが,「'utf-8' codec can't decode」の部分が'Shift_JIS'に置き換わった「'Shift_JIS' codec can't decode」というエラーが出るということをお伝えしたかったです。 正確な記載を書き,お手数をおかけして申し訳ありませんでした。
otn

2021/11/25 08:31

それは全然違うメッセージなので、最初から正しくエラーメッセージが書いてあれば、 もっと早く解決したでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問