Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

urllibライブラリの使い方

urllibはURLにアクセスするライブラリです。
urllibモジュールは、Python 3 で urllib.request, urllib.parse, urllib.error に分割されて名称変更されました。
 
・urllib.request は URL を開いて読むためのモジュールです
・urllib.error は urllib.request が発生させる例外を持っています
・urllib.parse は URL をパース(構文解釈)するためのモジュールです
・urllib.robotparser は robots.txt ファイルをパースするためのモジュールです
 
○URLを開く
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
コンテクストマネージャとして機能するオブジェクトを返す。
 メソッド:
  ・geturl() 取得したリソースのURLを返す。リダイレクトのチェック用。
  ・info() 取得したページのヘッダーなどのメタ情報をemail.message_from_string() インスタンスとして返す
  ・getcode() レスポンスの HTTP ステータスコード
 
(例)このブログのトップページのhtmlの最初の40文字を表示
 ①with asのコンテキストマネージャを利用する方法。

import urllib.request
with urllib.request.urlopen('http://python-remrin.hatenadiary.jp/') as f:
    print(f.read(40))  #b'<!DOCTYPE html>\n<html\n  lang="ja"\n\ndata

 
 ②with asを使わない方法。

import urllib.request
f = urllib.request.urlopen('http://python-remrin.hatenadiary.jp/')
print(f.read(40))  #b'<!DOCTYPE html>\n<html\n  lang="ja"\n\ndata-    

いずれもurlopen()はバイトオブジェクトを返している。(print()での表示が「b'」で始まっている)
 
○デコード
htmlのソースにと記述があれば、utf-8エンコードされているので、htmlのデコードにもutf-8を使う。
このブログもutf-8エンコードされているので、最初の100文字を表示してみる。

f = urllib.request.urlopen('http://python-remrin.hatenadiary.jp/')
print(f.read(100).decode('utf-8'))

すると、以下のように表示される。

<!DOCTYPE html>
<html
  lang="ja"

data-admin-domain="//blog.hatena.ne.jp"
data-author="rare_Remrin"

html全部を表示するときはread(100)の部分をread()に変更。
 
参考:
python3.5ドキュメント
urllib パッケージを使ってインターネット上のリソースを取得するには
[http://www.yoheim.net/blog.php?q=20160204:title=[Python] HTTP通信でGetやPostを行う]