🐍

PythonでWeb上のテキストファイルを読み込んで処理する

2022/02/21に公開

1. モチベーション

Python でローカルやサーバーなどに保管されたテキストファイルを読み込んで操作する場合はopen関数を使うことが多く、ネット上の情報も多数ある。
Web 上に存在する情報を取り扱う場合、多くは html ファイルの操作となる。このため、urllib.requestrequests、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