Extract the checkpoints and store in self.tracking_data

def Extract_Checkpoints(self):
		'''
			Extract the checkpoints and store in self.tracking_data
		'''

		# Make sure page is available
		if self.page is None:
			raise Exception("The HTML data was not fetched due to some reasons")

		# Check for invalid tracking number
		if 'Invalid number / data not currently available' in self.page:
			raise ValueError('Invalid number/data not currently available')

		# Checkpoints extraction begins here 
		
		soup = BeautifulSoup(self.page,'html.parser')
		
		# Assign the current status of the shipment - self.status

		current_status = soup.find('span',id='spnCurrentStatusValue').text.strip()
		if current_status == 'Supporting Document Returned to Shipper':	
			self.status = 'R'
		elif current_status == 'Delivered':
			self.status = 'C'
		else:											 # The shipment is in Transit
			self.status = 'T'

		# Get all rows of the Checkpoints table (no particular order)
		rows = soup.findAll('div',{'class':'fullWidth odd leftFloat bottomGreyBorder'})
		rows += soup.findAll('div',{'class':'fullWidth even leftFloat bottomGreyBorder'})

		for row in rows:
			# Get the data

			location = row.find('div',{'class':'leftFloat thirdWidth'}).string.strip()
			date_time = row.find('div',{'class':'leftFloat shipmentSummaryLabel'}).string.strip()
			status = row.find('div',{'class':'leftFloat shipmentHistoryActivityLabel'}).string.strip()

			# Clean it
			location = self.remove_non_ascii(location)
			date_time_format = "%d-%b-%Y %H:%M"
			date_time = parse(self.remove_non_ascii(date_time))
			status = self.remove_non_ascii(status)

			# Add it to the checkpoint list
			self.tracking_data.append({'status':status,'date':date_time,'location':location})

		self.tracking_data = sorted(self.tracking_data, key=lambda k: k['date'])