Created
August 26, 2011 21:08
-
-
Save sczizzo/1174448 to your computer and use it in GitHub Desktop.
Classesdev Lookup
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
require 'open-uri' | |
require 'nokogiri' | |
require 'yaml' | |
# Course, username, password | |
# e.g. ./classesdev-lookup.rb AFAM20005 mycnetid 'mysecretpassword' | |
exit(1) unless ARGV.length == 3 | |
course = ARGV[0] | |
course_php = 'https://classesdev.uchicago.edu/courseDetail.php?courseName=' | |
course_url = course_php + "#{course}" | |
course_doc = open( course_url, :http_basic_authentication => [ARGV[1], ARGV[2]] ) | |
document = Nokogiri::HTML course_doc | |
results = [] | |
document.xpath('//table[@class = "coursetable"]//tr').each do |r| | |
result = { | |
:course => r.xpath('td[@class="one"]/span[@class="name"]').text.strip, | |
:location => r.xpath('td[@class="one"]/span[@class="location"]').text.strip, | |
:title => r.xpath('td[@class="two"]').text.strip, | |
:schedule => r.xpath('td[@class="four"]').text.strip, | |
:enrollment => r.xpath('td[@class="five"]').text.strip | |
} | |
unless result[:title].empty? | |
course = result.delete :course | |
enrollment = result.delete :enrollment | |
# Parse enrollment for enrolled and maximum | |
# TODO encode strings as negative integers | |
m = /\A(?<enrolled>.*?)\/(?<maximum>.*?)\z/x.match enrollment | |
result[:enrolled] = m[:enrolled] | |
result[:maximum] = m[:maximum] | |
# TODO parse schedule and encode with ice_cube | |
result[:schedule].gsub! /\s+/, ' ' | |
if m = /\A(?<department>[A-Z]{4})\s*(?<number>\d{5})\s*\/\s*(?<section>\w{2})\z/x.match(course) | |
# Parse course identifier for department, number, and section | |
result[:department] = m[:department] | |
result[:number] = m[:number].to_i | |
result[:section] = m[:section] | |
result[:activities] = [] | |
result[:title] = result[:title][/\A(.*?) - Evaluations/i, 1] | |
results << result | |
elsif m = /\A(?<activity>.*?)\z/x.match(course) | |
result[:activity] = m[:activity].strip | |
result[:title] = result[:title][/\A(.*?)\r\n/, 1].strip | |
results.last[:activities] << result | |
end | |
end | |
end | |
puts results.to_yaml.strip |
Author
sczizzo
commented
Aug 26, 2011
Tip: Leave out the course number when you pass it into the script, and you'll get back results for the whole department.
$ ./classes-lookup.rb CMSC mycnetid 'mysecretpassword'
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment