вівторок, 15 березня 2011 р.

Nokogiri і XPath для розбору HTML таблиць

Вже третій місяць користуюся "Домашнім Інтернетом" від "Київстар". Система "Мій Київстар" дає змогу самостійно керувати своїми витратами в режимі онлайн. І звісно ж це вже потрібно автоматизувати. Для цього я буду використовувати наступні інструменти: Ruby, Mechanize, Nokogiri.

Аторизація на сайті Мій Київстар:

# -*- encoding: utf-8 -*-

require 'mechanize'
require 'nokogiri'

login    = '0010390***'
password = '***'

agent = Mechanize.new
agent.follow_meta_refresh = true

page = agent.get('https://my.kyivstar.ua/tbmb/login/perform.do')

login_form = page.form_with(:name => 'loginForm')
login_form.user     = login
login_form.password = password
show_page = agent.submit(login_form)

if show_page.uri.to_s == "https://my.kyivstar.ua/tbmb/disclaimer/show.do"
  puts "Login successful"
else
  puts "Login failure"
  exit
end

show_page_html = show_page.body.encode('utf-8', 'cp1251')

Розбір HTML таблиці використовуючи XPath:

doc = Nokogiri::HTML(show_page_html)
details = doc.search("//td[@id='mainContentBlock']/table/tr").collect do |row|
  title = row.at('td[1]').text.strip rescue ''
  data  = row.at('td[2]').text.strip.gsub("\n", " ") rescue ''
  {
    :title => title,
    :data  => data
  }
end

Вивід розпарсеної таблиці і поточного балансу:

pp details

balance = details.find {|e| e[:title] == "Поточний баланс:"}
puts "#{balance[:title]} #{balance[:data]}"

[{:title=>"Прізвище, ім'я, по-батькові:", :data=>"Іван Іванович"},
 {:title=>"Номер договору:", :data=>"0010390***"},
 {:title=>"Адреса підключення:", :data=>", Україна, Тернопіль"},
 {:title=>"Номер мобільного телефону:", :data=>"+38063*******"},
 {:title=>"Адреса електронної пошти:", :data=>"ivan.ivanovichlinux@gmail.com"},
 {:title=>nil, :data=>"Активуйте Вашу електронну адресу"},
 {:title=>nil, :data=>"Надіслати код активації"},
 {:title=>nil, :data=>nil},
 {:title=>"Особовий рахунок:", :data=>"0010390***"},
 {:title=>"Статус особового рахунка:", :data=>"Діючий"},
 {:title=>"Поточний баланс:", :data=>"55.09 грн."},
 {:title=>"Поріг відключення:", :data=>"0.0 грн."},
 {:title=>"Тарифний пакет:", :data=>"Турбо"},
 {:title=>"Статус послуги:", :data=>"Підключена"},
 {:title=>"Дата підключення:", :data=>"18.12.2010"}]
Поточний баланс: 55.09 грн.

Немає коментарів: