管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

PythonでSeleniumを使ってWebページ内のテーブルの内容を取得する

Webページを取得して操作する方法に、Seleniumというのがあるのを最近知りました。
Selenium - Web Browser Automation
テーブルが使われたWebページから内容を取得したかったので、その方法を調べました。
Seleniumはいろんな言語からアクセスすることが出来るようですが、今回はPythonを使ってみました。

対象となるページは以下のような感じ。

<html>
<head></head>
<body>
    <table class="table_desu">
        <tr>
            <th>No</th><th>品目</th><th>価格</th>
        </tr>
        <tr>
            <td>1</td><td>りんご</td><td>150</td>
        </tr>
        <tr>
            <td>2</td><td>みかん</td><td>120</td>
        </tr>
        <tr>
            <td>3</td><td>ぶどう</td><td>200</td>
        </tr>
    </table>
</body>
</html>

こちらは、Python+Seleniumで上記Webページにアクセスし、テーブルの内容を先頭行をのぞいて取得し、標準出力に表示する例です。
テーブル内容を取得する方法がJavascriptみたいで親近感わきましたが、実はもっとスマートなやり方があるのかしら...

#!/usr/bin/python
# -*- coding: utf-8 -*-

import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from pyvirtualdisplay import Display

BASE_URL = "http://hoge.fuga/"

try:
    display = Display(visible=0, size=(800, 600))
    display.start()

    driver = webdriver.Firefox()
    driver.implicitly_wait(30)

    # Webページへアクセス
    driver.get(BASE_URL)
    driver.implicitly_wait(15)
    
    # テーブル内容取得
    tableElem = driver.find_element_by_class_name("table_desu")
    trs = tableElem.find_elements(By.TAG_NAME, "tr")
    
    # ヘッダ行は除いて取得
    for i in range(1,len(trs)):
        tds = trs[i].find_elements(By.TAG_NAME, "td")
        line = ""
        for j in range(0,len(tds)):
            if j < len(tds)-1:
                line += "%s\t" % (tds[j].text)
            else:
                line += "%s" % (tds[j].text)
        print line+"\r\n"
except:
    print traceback.format_exc()
finally:

    if driver is not None:
        driver.quit()

    if display is not None:
        display.stop()

実行結果は以下の通り

1       りんご  150
2       みかん  120
3       ぶどう  200