学習内容
- 相対パスから絶対パスを取得する方法
- Python基本文法
相対パスから絶対パスを取得する方法
HTMLでリンク先が相対パスで記述されていた際には、urllib.parse.urljon()
を利用して絶対パスを取得する。
記述例
from urllib.parse import urljoin
base = "http://exsample.com/html/a.html"
compurl = lambda q: print(urljoin(base,q))
compurl("b.html")
compurl("sub/c.html")
compurl("../index.html")
compurl("../img/hoge.png")
実行結果
http://example.com/html/b.html
http://example.com/html/sub/c.html
http://example.com/index.html
http://example.com/img/hoge.png
Python基本文法
pass
文
Pythonではインデントによって処理ブロックを定義するので、処理を行う必要のない時には処理ブロック自体がなくなってしまう。そこで、何も処理を行うことを明示的に記述するためにpass
文を用いる。
with open('exsample.txt', 'w'):
pass
条件分岐
if
、elif
、else
を用いて記述する。また、一つの条件式によって2通りの処理ブロックに分岐する場合は三項演算子を用いて記述することもできる。
if 条件式1:
<処理ブロック1>
# 条件式1がTrueのときに実行される処理
elif 条件式2:
<処理ブロック2>
# 条件式1がFalse、かつ条件式2がTrueのときに実行される処理
else:
<処理ブロック3>
# 条件式1がFalse、かつ条件式2がFalse、かつ条件式3がTrueのときに実行される処理
# 三項演算子による条件分岐
# 条件式がTrueのとき値1、Falseのとき値2
値1 if 条件式 else 値2
イテレータ
データを表す値そのものではなく、一連のデータを生成することができるルールとしてデータを保持する。大量のデータが必要なときには、イテレータを用いた方がメモリ効率が良い。以下にrange
型のイテレータの記述例を示す。
# 以下3つのrange()は,0から9まで、1ずつ増えるイテレータを返す
range(0, 10, 1)
range(0, 10)
a = range(10)
print(a)
print(a[0])
実行結果
range(0, 10)
0
range()
は、Pythonでは使うことができないインクリメント演算子(++
)の機能を備えている。デクリメント(--
)はreversed()
というイテレータを用いて行う。
break
文とcontinue
文
ループ文の処理ブロック内に記述することで、実行中のループ文を制御することができる。
break
文
現在実行中のループを中断してループの外に抜ける。
b = 0
while True:
b += 1
if b > 5
break # b = 6 となった時点でループから抜けて処理が終了する。
print(b)
実行結果
1
2
3
4
5
continue
文
実行中の処理ブロックを中断して、ループの条件式評価まで処理を移動する。
c = 0
while True:
c += 1
if c < 5
continue # b = 6 となるまでこの先の処理は実行されない。
print(c)
break
実行結果
6
まとめ
利用しているスクレイピングに関する参考書のコードの理解に苦労し始めたので、再びPythonの基礎文法についての学習を始めることにした。C
やJava
では非常に便利だったインクリメント・デクリメントが使えないことには驚いたが、累算代入(+=
, -=
)やイテレータを用いてうまく対応していけるようにしたい。
参考書
参考にした書籍から公開されているGitHubを添付しておきます。
増補改訂Pythonによるスクレイピング&機械学習 開発テクニック