python3

Python3 + urllib + BeautifulSoupでネット上の情報を取得する

More than 1 year has passed since last update.

ウィキペディアのプログラミング言語一覧のページからプログラミング言語の名前とそのページヘのリンクを取得したのでまとめ。
このページ >> 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>)を取得する。

以上で、今回の目的の情報を取得することができた。