ウィキペディアのプログラミング言語一覧のページからプログラミング言語の名前とそのページヘのリンクを取得したのでまとめ。
このページ >> https://en.wikipedia.org/wiki/List_of_programming_languages
使ったものは「Python3, urllib, BeautifulSoup4」。
- Python 3.5.0 :: Anaconda 2.4.0
- BeautifulSoup4 4.4.1
まず、urllibを使って目的のページのHTML情報を取得。
import urllib.request
html = urllib.request.urlopen('https://en.wikipedia.org/wiki/List_of_programming_languages').read()
Python2.x系と違い、Python3ではurllib.request
というパッケージを使用する。
urllib.request.urlopen('<url>')
で指定したURLにアクセスした際のレスポンスに含まれるヘッダー情報なども取得できる。
今回はread
メソッドを使いHTML部分だけを使う。
次に、このHTMLをBeautifulSoupにくわせてスクレイピングの準備をする。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
BeautifulSoupのコンストラクタに'lxml'
を渡している。
これは第1引数がどうゆうファイルかを記述しておかないとwarningが出るので指定している。(warningメッセージを見る限り、なくても動作する模様。)
今回ほしいのは、各プログラミング言語の名称とそのページヘのaタグのhrefの情報。
先ほどのリンクのソースコードを確認してみると、multcolクラス属性のtableタグ内にあるli要素からaタグの部分を取ってくれば良さそうということがわかる。(ここは人力。)
BeautifulSoupでは、findAll
メソッドにタグとクラスの指定を引数として渡せば、特定のクラスの付いているタグのみを一括で取得するということができる。
tables = soup.findAll('table', class_='multicol')
# 第一引数: 取得したいタグの指定、class_: クラス属性の指定
ここで、findAll
メソッドで取得した場合、取得結果がResultSet
というまとまった形で取得される。この中の各要素を取得するには、インデックスを指定するかループを回す。
tableタグに含まれる要素が取得できたので、今度はtableタグの中身を確認する。
各プログラミング言語のリンクにアクセスするには、tableタグ内のli要素を取ってきて、その中のaタグの情報を見れば良さそう。
各table内にliタグが複数あるのでこれをfindAll
メソッドで取ってきたあとに、各li要素のaタグの情報をfind
メソッドで取ってくる。
for table in tables:
for li in table.findAll('li'):
a = li.find('a')
print("%s's url is %s" % (a.text, a.attrs['href']))
findAll
メソッドの結果に対してループを回しに各要素にアクセスし、さらにfind
メソッドを使って特定のタグの情報に取得する。
text
メソッドはタグの間に記述されている文字列(<a>ここ!</a>
)を取得し、attrs
メソッドはタグにつけられている属性の情報(attrs['href'] => <a href='ここ!'>...</a>
)を取得する。
以上で、今回の目的の情報を取得することができた。