読者です 読者をやめる 読者になる 読者になる

なにも わからぬ

パソコンとプログラミング関係をメモっていきたい

HTTPライブラリで得たhtml文字列をブラウザで表示する

Python3

requestsなどのHTTPライブラリで取得したHTMLの内容を確認するのに、いちいち文字コードを変換したりタグを消したりしてコンソール上でチェックするのはめんどくさい。その都度いちいちファイルに保存してそれをブラウザに持ってくのもやっぱめんどくさい。ということでtempfileでhtmlファイルを作り、そのパスをブラウザで開かせるまでを関数化してみた。

import tempfile
import webbrowser

def view_in_browser(content):
    ''' bytes型をtemfileに書き込んでそのパスをブラウザに送る '''

    with tempfile.NamedTemporaryFile(suffix=".html", delete=False) as tf:
        tf.write(content)
        webbrowser.open(tf.name)

tempfile.NamedTemporaryFileはデフォルトでmode="w+b"なので文字列じゃなくてバイト列を渡さなければならない。もちろんmode="w"にすれば文字列を受け付けるけど、そうすると結局文字コード指定で一手間かかるだけだしrequestsのレスポンスのcontentプロパティにはバイト列が入ってるからデフォルトのままでいいと思う。

delete=True(デフォルト)だと上記のコードではwithブロックを出た時点でファイルが削除されるので、ブラウザが読み込もうとした時には既にファイルが無いということになる。withブロック内で処理を止めるならdelete=Trueでもいいけど。


requestsはHTTPヘッダのContent-Typecharset=hogehogeが入ってないと、HTMLのmetaに何が書いてあっても読んでくれない(HTMLパーサじゃないから当たり前)ので日本語文書は高確率で文字化けする。でも大抵r.apparent_encodingに正しい文字コードが入ってるから

r.encoding = r.apparent_encoding

文字コードの不一致は大体解消する模様。参考:https://blog.aoshiman.org/entry/118/

なお、r.textの中身は文字列なので操作するときに文字コードがおかしいと怒られるが、上記の通りr.contentバイト列なのでファイルに書き出すならこっち使った方が楽。ブラウザが表示するときはもちろんmeta要素見るわけだし。


関係ないけど、ブラウザの環境変数だけ見れば、requestsに以下のヘッダ付けて最新のWin10 x64 Edgeと同等に見えるかな?

headers = {
        "Accept": "text/html, application/xhtml+xml, image/jxr, */*",
        "Accept-Language": "ja",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
}