pythonのrequestsでコンテンツがhtmlかどうか判定する

Pythonで特定サイトの内部リンクをすべて抜き出すプログラムを作っていた時に、requestsライブラリを使用して取得したコンテンツがhtmlなのかどうか、つまりページなのかどうかを判定する必要がありましたので、メモとして残しておきます。

requestsライブラリの使い方はご存じの前提で進めさせていただきます。



やりたいこと

今自分は、特定サイトの内部リンクをすべて抜き出すプログラムを作っておりまして、内部リンクなのか外部リンクなのかは置いておき、htmlのみ、つまりページのみがほしい状況にあります。画像ファイルやOfficeファイルはほしくないのですが、aタグには往々にして画像ファイルやofficeファイル、その他のファイルが埋め込まれていることがあります。そこで今回やりたいことが、リンク先がページなのかどうかということを判定する、という事になります。




最初に考えたこと

最初に考えたのが、「そもそもrequestsする前に、リンクを見てページなのかどうか判断しする」という事でした。
つまり下記のように想定される拡張子をすべてリストで用意してリンクに含まれていない場合だけ処理を行うという形です。

import requests

def is_page(link):
    not_want_extensions = [
        ".jpg",".jpeg",".JPG",".JPEG",".jpe",".jfif",".pjpeg",".pjp",
        ".png",".gif",".tiff",".tif",".webp",".svg",".svgz",".pdf",
        ".docx",".doc",".xlsx",".xlsm",".xls",".pptx",".ppt",
        ".zip",".txt",".csv",
    ]

    for target_extension in target_extensions:
        if target_extension in link:
            return False

    return True


.
.
.
if is_page(link):
    ~処理~




しかし、このやり方だと自分が把握してない拡張子が存在した場合を考えると恐ろしいです。さらに、すべて把握してリストとして用意したとしても、新しい拡張子が登場する度に、プログラムを修正する必要があります。

そこで考えたのが『requestsで取得したコンテンツがhtmlかどうか判定できないか』という事でした。





responseのヘッダーを見てみる

『.headers』でレスポンスのヘッダーを見れるという事を知ったので、 見てみました。
『Content-Type』というものがあります、これは使えそうですね。

import requests

response = requests.get('https://hoge.com')
print(response.headers)


==========出力==========
{
    'Server': 'nginx', 
    'Date': 'Mon, 20 Jun 2022 08:07:49 GMT',
    'Content-Type': 'text/html',
    'Content-Length': '146',
    'Connection': 'keep-alive',
    'Keep-Alive': 'timeout=20'
}






requestsでコンテンツがhtmlかどうか判定

下記のように、先ほど見つけたContent-Typeを確認して『text/html』の場合のみ、ページであるとします。
これでrequestsライブラリのレスポンスを見てページかどうか判定することができました。

import requests

def is_page(link):
    response = requests.get(link)
    content_type = response.headers["Content-Type"]
    if 'text/html' in content_type:
        return True
    else:
        return False


.
.
.
if is_page(link):
    ~処理~





間違ったContent-Typeが設定されていても大丈夫か

これでいこうと思ったときに一つだけ気になったことがありまして、例えばページなのに記述ミスでContent-Typeがapplication/pdfなどとなってた場合どうなるのか、という事でした。

下記のようなサンプルファイルを用意して、requests実行・レスポンス確認したところ、ちゃんとtext/htmlになっていました。

<meta http-equiv="Content-Type" content="application/pdf; charset=utf-8">

<p>Test.php</p>






以上、pythonのrequestsでコンテンツがhtmlかどうか確認する方法でした。

コメント

タイトルとURLをコピーしました