cssセレクタを抽出

dj.htmlを作ります。djの世界ランキング。ulli要素のみ。

<ul id="dj">
	<li id="mg">Martin Carrix</li>
	<li id="dv">Dimitri Vegas & Like Mike</li>
	<li id="ab">Armin van Buuren</li>
	<li id="hd">Hardwell</li>
	<li id="tj">Tjesto</li>
	<li id="cs">The Chainsmokers</li>
	<li id="dg">David Guetta</li>
	<li id="aj">Afrojack</li>
	<li id="sa">Steve Aoki</li>
	<li id="mm">Marshmello</li>
</ul>

続いて、python

from bs4 import BeautifulSoup
fp = open("dj.html", encoding="utf-8")
soup = BeautifulSoup(fp, "html.parser")

sel = lambda q : print(soup.select_one(q).string)
sel("#mm")
sel("li#sa")
sel("ul > li#aj")
sel("#dj #dg")
sel("#dj > #cs")
sel("ul#dj > li#tj")
sel("li[id='hd']")
sel("li:nth-of-type(2)")

print(soup.select("li")[1].string)
print(soup.find_all("li")[0].string)

[vagrant@localhost python]$ python3 app.py
Marshmello
Steve Aoki
Afrojack
David Guetta
The Chainsmokers
Tjesto
Hardwell
Dimitri Vegas & Like Mike
Dimitri Vegas & Like Mike
Martin Carrix

sel(“li:nth-of-type(2)”)と、print(soup.select(“li”)[1].string)の値が同じなのがわかります。配列だと、普通0から始まりますが、nth-of-type(n)は1からのようですね。

>ラムダ式(lambda)を用いて名前のない関数を書けます。名前のない関数を 無名関数 と呼びます。名前が必要ない小さな関数を作るための機能です。
>ラムダ式は以下のように書きます。引数と処理をコロン(:)で区切って書きます。引数が複数ある場合は、通常の関数と同じように感まで区切ります。
lambda q :が無名関数です。
sel = lambda a : print(soup.select_one(a).string) と書いても、同じように動きます。