brent timothy saner on 27 Nov 2018 18:59:27 -0800 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [PLUG] OT: MontCo Dispatch system web & RSS |
On 11/27/18 7:13 PM, Keith C. Perry wrote: > That's pretty slick. > > Since you mentioned hams though... > > I've been practicing my HF mobile work. The bands have been a bit challenging the last couple of days. I worked a more local station 205 miles west of Philly on 80m last night and we all agreed the band was doing some very very weird things. > > I've been enjoying the challenge of listening for and getting better at working those stations buried a bit further down in the noise. Never know when such a skill will be needed due to a more series event when all the "slick" services are down. because you can never have too much python fun, i wrote a parser (see attached). it currently just converts it to JSON, but if you know a little python yourself i'm sure you can extend it into some fun. it's more important that everyone learn how awesome XML is. ;) it's obj-oriented - the parsed RSS XML is converted to a python dict in a class attribute, so you can import it and instance it all you want, etc.
#!/usr/bin/env python3 # http://lists.netisland.net/archives/plug/plug-2018-11/msg00065.html # Note that you could take it even further, i.e. collating into MySQL or Sqlite3 DB, feed it into a TTS, # break the rss/channel/item/description into linebreaks based on ; and turn it into mailing labels, all sorts of fun # stuff. import datetime try: from lxml import etree has_lxml = True except ImportError: # p.s. you definitely should install python-lxml: # - it's safer # - it's faster # - using it won't make you want to slap your grandma from xml.etree import ElementTree as etree has_lxml = False from urllib.request import urlopen class IncidentParser(object): def __init__(self, incident_url = 'https://webapp02.montcopa.org/eoc/cadinfo/livecadrss.asp'): self.url = incident_url self.events = [] self.__getRaw__() self.__parseXML__() def __getRaw__(self): # Laziest error catching ever, but it's gonna be the problem 9/10 times. try: with urlopen(self.url) as webdata: self.xmlobj = etree.fromstring(webdata.read()) except Exception as e: self.xmlobj = None raise RuntimeError('Can\'t connect to {0}. Network error?'.format(self.url)) return() def __parseXML__(self): if self.xmlobj is None: return() self.xml = self.xmlobj.findall('channel') for channel in self.xml: _channel = {'Events': []} # Get "channel" info, i.e. metadata of the feed. # Technically we can expand this to the full spec of RSS, found at https://cyber.harvard.edu/rss/rss.html # but since we're PoCing it specifically for the Montco events feed, we can trim it down to just the # information they populate. for x in ('title', 'link', 'description', 'ttl'): # They should only have at most ONE of these, I think? I haven't checked the XSD lately. e = channel.find(x) if e is not None and e.text: _channel[e.tag.title()] = e.text for e in channel.findall('item'): # Each item is an "event" notification container. _event = {} for x in ('title', 'link', 'description', 'pubDate'): sub = e.find(x) if sub is not None and sub.text: # See https://cyber.harvard.edu/rss/rss.html#hrelementsOfLtitemgt # to understand why we serialize these as list items instead of dicts # with titles keying. # if x == 'title': # _event_name = sub.text # continue data = (sub.text if x != 'pubDate' # Yes, I'm a showoff. # This will FAIL on anything but UTC/GMT, and it isn't conversion-aware. # https://bugs.python.org/issue22377 else datetime.datetime.strptime(sub.text, '%a, %d %b %Y %H:%M:%S %Z')) name = (sub.tag if x != 'pubDate' else 'Published') _event[name.title()] = data _channel['Events'].append(_event) self.events.append(_channel) def main(): import json ip = IncidentParser() print(json.dumps(ip.events, indent = 4, default = str)) if __name__ == '__main__': main()
Attachment:
signature.asc
Description: OpenPGP digital signature
___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug