PythonでWeb上のテキストファイルを読み込んで処理する
1. モチベーション
Python でローカルやサーバーなどに保管されたテキストファイルを読み込んで操作する場合はopen
関数を使うことが多く、ネット上の情報も多数ある。
Web 上に存在する情報を取り扱う場合、多くは html ファイルの操作となる。このため、urllib.request
やrequests
、Beautiful Soup 4(bs4
)等を使った html ファイル上の情報の parse が良く知られている。
一方、Web 上に存在する古い情報の中には、希にプレーンなテキストファイルで提供されているものがある。しかし、これらのテキストファイルを Web から直接 requests 等で取り扱う方法に関する情報は多くない。
テキストファイルをダウンロードして取り扱うことも可能だが、ダウンロード後のファイル処理などが面倒になると考え、urllib.request.urlopen
で下記を実施することにした。
2. やったこと
ダウンロード後に処理する際の例:
with open('../data/s0603-7.txt', encoding='cp932') as f:
lines = f.readlines()
open でひらいたテキストファイルは、<class '_io.TextIOWrapper'>
クラスのオブジェクトとして取り扱うことができるので、readlines で一行ごとの読み込みが可能。
urllib.request.urlopen
での処理例:
with urllib.request.urlopen(
'https://www.mhlw.go.jp/shingi/2010/06/txt/s0603-7.txt') as f:
lines = f.read().decode('cp932').split('\n')
urllib.request.urlopen
で開いたファイルはhttp.client.HTTPResponse
オブジェクトになるので、read().decode()
でstr
オブジェクトにしてから、処理(この場合は改行コードで split
してリスト化)する。
分解してそれぞれのタイプを確認すると、下記のようになる。
with urllib.request.urlopen('https://www.mhlw.go.jp/shingi/2010/06/txt/s0603-7.txt') as f:
obj = f
str = obj.read().decode('cp932')
lines = str.split('\n')
print(type(obj))
print(type(str))
print(type(lines))
<class 'http.client.HTTPResponse'>
<class 'str'>
<class 'list'>
参考: io --- ストリームを扱うコアツール - TextIOWrapper — Python 3.9 ドキュメント
参考事例のソース:厚生労働省 薬事・食品衛生審議会(薬事・食品衛生審議会医薬品第一部会)の過去議事録から。
次の予定:同様の処理を Web 上の PDF ファイルをbyte
オブジェクトとして扱い、本文の text を抽出して処理対象とする。
Discussion