Re: HTML parse error
sharifah ummu kulthum <[email protected]> Tue, 23 Feb 2010 11:45:36 +0800
| Newsgroups | gmane.comp.python.xml |
|---|---|
| Message-ID | <[email protected]> |
--===============0910614892== Content-Type: multipart/alternative; boundary=001485f64af0ec4b7804803c61f6 --001485f64af0ec4b7804803c61f6 Content-Type: text/plain; charset=ISO-8859-1 On Mon, Feb 22, 2010 at 10:46 PM, Stefan Behnel <[email protected]> wrote: > sharifah ummu kulthum, 22.02.2010 14:24: > > File "grabmy.py", line 63, in get_html > > return BeautifulSoup(content) > > File "build/bdist.linux-i686/egg/BeautifulSoup.py", line 1499, in > __init__ > > File "build/bdist.linux-i686/egg/BeautifulSoup.py", line 1230, in > __init__ > > File "build/bdist.linux-i686/egg/BeautifulSoup.py", line 1263, in _feed > > File "/usr/lib/python2.6/HTMLParser.py", line 108, in feed > > self.goahead(0) > > File "/usr/lib/python2.6/HTMLParser.py", line 148, in goahead > > k = self.parse_starttag(i) > > File "/usr/lib/python2.6/HTMLParser.py", line 226, in parse_starttag > > endpos = self.check_for_whole_start_tag(i) > > File "/usr/lib/python2.6/HTMLParser.py", line 301, in > > check_for_whole_start_tag > > self.error("malformed start tag") > > File "/usr/lib/python2.6/HTMLParser.py", line 115, in error > > raise HTMLParseError(message, self.getpos()) > > HTMLParser.HTMLParseError: malformed start tag, at line 830, column 36 > > Just noticed this now - you seem to be using BeautifulSoup, likely version > 3.1. This version does not support parsing broken HTML any well, so use > version 3.0.8 instead, or switch to the tools I indicated. > > Note that switching tools means that you need to change your code to use > them. Just installing them is not enough. > > Stefan > > I am so sorry but I really don't know how to change the code as I have just learn python. How am I going to switch the version or to change the code? Because I don't really understand the code. Here is the code: ''' Copyright (c) 2008 Yap Sok Ann <[email protected]> This module contains xmltv grabbers for Malaysia channels. ''' __author__ = 'Yap Sok Ann <[email protected]>' __license__ = 'PSF License' import logging from datetime import date as dt from datetime import datetime, time, timedelta from dateutil.tz import tzlocal from httplib2 import Http from lxml import etree from urllib import urlencode from BeautifulSoup import BeautifulSoup channels = ['rtm1', 'rtm2', 'tv3', 'ntv7', '8tv', 'tv9'] datetime_format = '%Y%m%d%H%M%S %z' h = Http() h.force_exception_to_status_code = True #h.timeout = 15 logging.basicConfig( level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(process)d %(message)s', ) log = logging.getLogger(__name__) def strclean(s): s = s.strip().replace('‘', '\'').replace('’', '\'') if s != ' ': return s class Grabber(object): base_url = None def __init__(self, channel): self.channel = channel self.url = self.base_url def qs_params(self, date, **kwargs): '''Returns a dict of params to form the url's query string ''' raise NotImplementedError def _parse_html(self, date, html): '''Returns a list of dicts with the following keys: - mandatory: title, start - optional: stop, sub_title, desc, episode_number, episode_system ''' raise NotImplementedError def get_html(self, date, **kwargs): params = self.qs_params(date, **kwargs) response, content = h.request(self.url + '?' + urlencode(params)) if response.status == 200: return BeautifulSoup(content) else: log.error('Status: %s\nContent: %s' % (response.status, content)) def parse_html(self, date, html): prev_schedule = None try: for schedule in self._parse_html(date, html): if 'stop' in schedule: yield schedule elif prev_schedule: prev_schedule['stop'] = schedule['start'] yield prev_schedule prev_schedule = schedule except: log.exception('Cannot parse html for date %s' % date) def to_xml(self, schedules): for schedule in schedules: program = etree.Element('programme', channel=self.channel, start=schedule['start'].strftime(datetime_format), stop=schedule['stop'].strftime(datetime_format)) title = etree.SubElement(program, 'title') title.text = schedule['title'] if schedule.get('episode_num'): episode_num = etree.SubElement(program, 'episode-num') episode_num.set('system', schedule.get('episode_system')) episode_num.text = schedule['episode_num'] for field in ['sub_title', 'desc']: if schedule.get(field): elem = etree.SubElement(program, field.replace('_', '-')) elem.text = schedule[field] yield program def grab(self, date, **kwargs): html = self.get_html(date, **kwargs) if html: return self.to_xml(self.parse_html(date, html)) class Astro(Grabber): base_url = 'http://www.astro.com.my/channels/%(channel)s/Default.asp' params_dicts = [dict(batch=1), dict(batch=2)] ignores = ['No Transmission', 'Transmission Ends'] def __init__(self, channel): self.channel = channel self.url = self.base_url % dict(channel=channel) def qs_params(self, date, **kwargs): kwargs['sDate'] = date.strftime('%d-%b-%Y') return kwargs def _parse_html(self, date, html): header_row = html.find('tr', bgcolor='#29487F') for tr in header_row.fetchNextSiblings('tr'): tds = tr.findChildren('td') title = strclean(tds[1].find('a').string) if title in self.ignores: continue # start time, '21:00' -> 9 PM hour, minute = [int(x) for x in tds[0].string.split(':')] start = datetime.combine(date, time(hour, minute, tzinfo=tzlocal())) # duration, '00:30' -> 30 minutes hours, minutes = [int(x) for x in tds[2].string.split(':')] stop = start + timedelta(hours=hours, minutes=minutes) yield dict(title=title, start=start, stop=stop) class TheStar(Grabber): base_url = 'http://star-ecentral.com/tvnradio/tvguide/guide.asp' params_dicts = [dict(db='live')] def qs_params(self, date, **kwargs): kwargs['pdate'] = date.strftime('%m/%d/%Y') kwargs['chn'] = self.channel.replace('rtm', 'tv') return kwargs def _parse_html(self, date, html): last_ampm = None header_row = html.find('tr', bgcolor='#5e789c') for tr in header_row.fetchNextSiblings('tr'): tds = tr.findChildren('td') schedule = {} schedule['title'] = strclean(tds[1].find('b').find('font').string) schedule['desc'] = strclean(tds[2].find('font').string) episode_num = strclean(tds[3].find('font').string) if episode_num: try: episode_num = int(episode_num) - 1 episode_num = '.' + str(episode_num) + '.' episode_system = 'xmltv_ns' except ValueError: episode_system = 'onscreen' schedule['episode_num'] = episode_num schedule['episode_system'] = episode_system # start time, '9.00pm' -> 9 PM time_str = tds[0].find('font').string ampm = time_str[-2:] hour, minute = [int(x) for x in time_str[:-2].split('.')] if ampm == 'pm' and hour < 12: hour += 12 elif ampm =='am' and hour == 12: hour = 0 if last_ampm == 'pm' and ampm == 'am': date = date + timedelta(1) schedule['start'] = datetime.combine( date, time(hour, minute, tzinfo=tzlocal())) last_ampm = ampm yield schedule def main(): from optparse import OptionParser parser = OptionParser() parser.add_option('-s', '--source', dest='source', help='SOURCE to grab from: Astro, TheStar. Default: TheStar') parser.add_option('-d', '--date', dest='date', help='Start DATE to grab schedules for (YYYY-MM-DD). Default: today') parser.add_option('-n', '--days', dest='days', help='Number of DAYS to grab schedules for. Default: 1') parser.add_option('-f', '--file', dest='filename', metavar='FILE', help='Output FILE to write to. Default: stdout') options, args = parser.parse_args() if options.source is None: cls = TheStar else: cls = globals()[options.source] if options.date is None: date = dt.today() else: date = dt(*[int(x) for x in options.date.split('-')]) if options.days is None: days = 1 else: days = int(options.days) root = etree.Element('tv') for channel in channels: grabber = cls(channel) for i in range(days): for params_dict in cls.params_dicts: for elem in grabber.grab(date + timedelta(i), **params_dict): root.append(elem) xml = etree.tostring(root, encoding='UTF-8', xml_declaration=True, pretty_print=True) if options.filename is None: print xml else: open(options.filename, 'w').write(xml) if __name__ == '__main__': main() --001485f64af0ec4b7804803c61f6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <br><br><div class=3D"gmail_quote">On Mon, Feb 22, 2010 at 10:46 PM, Stefan= Behnel <span dir=3D"ltr"><<a href=3D"mailto:[email protected]">stefan= [email protected]</a>></span> wrote:<br><blockquote class=3D"gmail_quote" st= yle=3D"border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex= ; padding-left: 1ex;"> <div class=3D"im">sharifah ummu kulthum, 22.02.2010 14:24:<br> </div><div class=3D"im">> =A0 File "grabmy.py", line 63, in ge= t_html<br> > =A0 =A0 return BeautifulSoup(content)<br> > =A0 File "build/bdist.linux-i686/egg/BeautifulSoup.py", line= 1499, in __init__<br> > =A0 File "build/bdist.linux-i686/egg/BeautifulSoup.py", line= 1230, in __init__<br> > =A0 File "build/bdist.linux-i686/egg/BeautifulSoup.py", line= 1263, in _feed<br> > =A0 File "/usr/lib/python2.6/HTMLParser.py", line 108, in fe= ed<br> > =A0 =A0 self.goahead(0)<br> > =A0 File "/usr/lib/python2.6/HTMLParser.py", line 148, in go= ahead<br> > =A0 =A0 k =3D self.parse_starttag(i)<br> > =A0 File "/usr/lib/python2.6/HTMLParser.py", line 226, in pa= rse_starttag<br> > =A0 =A0 endpos =3D self.check_for_whole_start_tag(i)<br> > =A0 File "/usr/lib/python2.6/HTMLParser.py", line 301, in<br= > > check_for_whole_start_tag<br> > =A0 =A0 self.error("malformed start tag")<br> > =A0 File "/usr/lib/python2.6/HTMLParser.py", line 115, in er= ror<br> > =A0 =A0 raise HTMLParseError(message, self.getpos())<br> > HTMLParser.HTMLParseError: malformed start tag, at line 830, column 36= <br> <br> </div>Just noticed this now - you seem to be using BeautifulSoup, likely ve= rsion<br> 3.1. This version does not support parsing broken HTML any well, so use<br> version 3.0.8 instead, or switch to the tools I indicated.<br> <br> Note that switching tools means that you need to change your code to use<br= > them. Just installing them is not enough.<br> <font color=3D"#888888"><br> Stefan<br> <br> </font></blockquote></div><br>I am so sorry but I really don't know how= to change the code as I have just learn python. How am I going to switch t= he version or to change the code? Because I don't really understand the= code.<br> <br>Here is the code:<br><br><span style=3D"font-family: courier new,monosp= ace;">'''</span><br style=3D"font-family: courier new,monospace= ;"><span style=3D"font-family: courier new,monospace;">Copyright (c) 2008= =A0 Yap Sok Ann <<a href=3D"mailto:[email protected]">[email protected]</a>&= gt;</span><br style=3D"font-family: courier new,monospace;"> <br style=3D"font-family: courier new,monospace;"><span style=3D"font-famil= y: courier new,monospace;">This module contains xmltv grabbers for Malaysia= channels.</span><br style=3D"font-family: courier new,monospace;"><span st= yle=3D"font-family: courier new,monospace;">'''</span><br style= =3D"font-family: courier new,monospace;"> <br style=3D"font-family: courier new,monospace;"><span style=3D"font-famil= y: courier new,monospace;">__author__ =3D 'Yap Sok Ann <<a href=3D"m= ailto:[email protected]">[email protected]</a>>'</span><br style=3D"font= -family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">__license__ =3D 'PS= F License'</span><br style=3D"font-family: courier new,monospace;"><br = style=3D"font-family: courier new,monospace;"><span style=3D"font-family: c= ourier new,monospace;">import logging</span><br style=3D"font-family: couri= er new,monospace;"> <br style=3D"font-family: courier new,monospace;"><span style=3D"font-famil= y: courier new,monospace;">from datetime import date as dt</span><br style= =3D"font-family: courier new,monospace;"><span style=3D"font-family: courie= r new,monospace;">from datetime import datetime, time, timedelta</span><br = style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">from <a href=3D"http://= dateutil.tz">dateutil.tz</a> import tzlocal</span><br style=3D"font-family:= courier new,monospace;"><span style=3D"font-family: courier new,monospace;= ">from httplib2 import Http</span><br style=3D"font-family: courier new,mon= ospace;"> <span style=3D"font-family: courier new,monospace;">from lxml import etree<= /span><br style=3D"font-family: courier new,monospace;"><span style=3D"font= -family: courier new,monospace;">from urllib import urlencode</span><br sty= le=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">from BeautifulSoup impo= rt BeautifulSoup</span><br style=3D"font-family: courier new,monospace;"><b= r style=3D"font-family: courier new,monospace;"><span style=3D"font-family:= courier new,monospace;">channels =3D ['rtm1', 'rtm2', '= ;tv3', 'ntv7', '8tv', 'tv9']</span><br style=3D= "font-family: courier new,monospace;"> <br style=3D"font-family: courier new,monospace;"><span style=3D"font-famil= y: courier new,monospace;">datetime_format =3D '%Y%m%d%H%M%S %z'</s= pan><br style=3D"font-family: courier new,monospace;"><br style=3D"font-fam= ily: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">h =3D Http()</span><br = style=3D"font-family: courier new,monospace;"><span style=3D"font-family: c= ourier new,monospace;">h.force_exception_to_status_code =3D True</span><br = style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">#h.timeout =3D 15</span= ><br style=3D"font-family: courier new,monospace;"><br style=3D"font-family= : courier new,monospace;"><span style=3D"font-family: courier new,monospace= ;">logging.basicConfig(</span><br style=3D"font-family: courier new,monospa= ce;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 level=3Dloggi= ng.DEBUG,</span><br style=3D"font-family: courier new,monospace;"><span sty= le=3D"font-family: courier new,monospace;">=A0=A0=A0 format=3D'%(asctim= e)s %(levelname)-8s %(process)d %(message)s',</span><br style=3D"font-f= amily: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">)</span><br style=3D"fo= nt-family: courier new,monospace;"><span style=3D"font-family: courier new,= monospace;">log =3D logging.getLogger(__name__)</span><br style=3D"font-fam= ily: courier new,monospace;"> <br style=3D"font-family: courier new,monospace;"><span style=3D"font-famil= y: courier new,monospace;">def strclean(s):</span><br style=3D"font-family:= courier new,monospace;"><span style=3D"font-family: courier new,monospace;= ">=A0=A0=A0 s =3D s.strip().replace('&lsquo;', '\''= ).replace('&rsquo;', '\'')</span><br style=3D"font-= family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 if s !=3D = 9;&nbsp;':</span><br style=3D"font-family: courier new,monospace;">= <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 r= eturn s</span><br style=3D"font-family: courier new,monospace;"> <br style=3D"font-family: courier new,monospace;"><span style=3D"font-famil= y: courier new,monospace;">class Grabber(object):</span><br style=3D"font-f= amily: courier new,monospace;"><span style=3D"font-family: courier new,mono= space;">=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 base_url =3D = None</span><br style=3D"font-family: courier new,monospace;"><span style=3D= "font-family: courier new,monospace;">=A0=A0=A0 </span><br style=3D"font-fa= mily: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def __init__(= self, channel):</span><br style=3D"font-family: courier new,monospace;"><sp= an style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 self= .channel =3D channel</span><br style=3D"font-family: courier new,monospace;= "> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 s= elf.url =3D self.base_url</span><br style=3D"font-family: courier new,monos= pace;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span= ><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def qs_params= (self, date, **kwargs):</span><br style=3D"font-family: courier new,monospa= ce;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0= =A0 '''Returns a dict of params to form the url's query str= ing</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 &= #39;''</span><br style=3D"font-family: courier new,monospace;"><spa= n style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 raise= NotImplementedError</span><br style=3D"font-family: courier new,monospace;= "> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 def _parse_html(self, date, html):</span><br= style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 &= #39;''Returns a list of dicts with the following keys:</span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 - mandatory: title, start</span>= <br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 -= optional: stop, sub_title, desc, episode_number, episode_system</span><br = style=3D"font-family: courier new,monospace;"><span style=3D"font-family: c= ourier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 '''</span><br styl= e=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 r= aise NotImplementedError</span><br style=3D"font-family: courier new,monosp= ace;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span>= <br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def get_html(= self, date, **kwargs):</span><br style=3D"font-family: courier new,monospac= e;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0= =A0 params =3D self.qs_params(date, **kwargs)</span><br style=3D"font-famil= y: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 r= esponse, content =3D h.request(self.url + '?' + urlencode(params))<= /span><br style=3D"font-family: courier new,monospace;"><span style=3D"font= -family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 if response.status = =3D=3D 200:</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 return BeautifulSoup(content)</span><br style=3D"font-family: = courier new,monospace;"><span style=3D"font-family: courier new,monospace;"= >=A0=A0=A0=A0=A0=A0=A0 else:</span><br style=3D"font-family: courier new,mo= nospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 log.error('Status: %s\nContent: %s' % (response.status= , content))</span><br style=3D"font-family: courier new,monospace;"><span s= tyle=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br style=3D"= font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def parse_htm= l(self, date, html):</span><br style=3D"font-family: courier new,monospace;= "><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= prev_schedule =3D None</span><br style=3D"font-family: courier new,monospa= ce;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 t= ry:</span><br style=3D"font-family: courier new,monospace;"><span style=3D"= font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 for = schedule in self._parse_html(date, html):</span><br style=3D"font-family: c= ourier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 if 'stop' in schedule:</span><br style=3D"= font-family: courier new,monospace;"><span style=3D"font-family: courier ne= w,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 yie= ld schedule</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 elif prev_schedule:</span><br style=3D"font-family= : courier new,monospace;"><span style=3D"font-family: courier new,monospace= ;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 prev_schedule[= 'stop'] =3D schedule['start']</span><br style=3D"font-famil= y: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 yield prev_schedule</span><br style=3D= "font-family: courier new,monospace;"><span style=3D"font-family: courier n= ew,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 prev_schedule = =3D schedule</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 e= xcept:</span><br style=3D"font-family: courier new,monospace;"><span style= =3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 = log.exception('Cannot parse html for date %s' % date)</span><br sty= le=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 def to_xml(self, schedules):</span><br style= =3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 f= or schedule in schedules:</span><br style=3D"font-family: courier new,monos= pace;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 program =3D etree.Element('programme', channel= =3Dself.channel,</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 start=3Dschedule['start'].strftime(datetim= e_format),</span><br style=3D"font-family: courier new,monospace;"><span st= yle=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 stop=3Dschedule['stop'].strftime(datetime_format))<= /span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"><span= style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 title =3D etree.SubElement(program, 'title')</span><br style= =3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 title.text =3D schedule['title']</span><br style=3D"fo= nt-family: courier new,monospace;"><span style=3D"font-family: courier new,= monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 </span><br style=3D"font-fami= ly: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 if schedule.get('episode_num'):</span><br style=3D"fon= t-family: courier new,monospace;"><span style=3D"font-family: courier new,m= onospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 episode_num =3D et= ree.SubElement(program, 'episode-num')</span><br style=3D"font-fami= ly: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 episode_num.set('system', schedule.get(= 9;episode_system'))</span><br style=3D"font-family: courier new,monospa= ce;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0 episode_num.text =3D schedule['episode_num&= #39;]</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"><span= style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 for field in ['sub_title', 'desc']:</span><br style= =3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 if schedule.get(field):</span><br style=3D"font-fa= mily: courier new,monospace;"><span style=3D"font-family: courier new,monos= pace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 elem =3D e= tree.SubElement(program, field.replace('_', '-'))</span><br= style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 elem.text =3D schedule[field]</span><b= r style=3D"font-family: courier new,monospace;"><span style=3D"font-family:= courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 </span><br style= =3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 yield program</span><br style=3D"font-family: courier new,mono= space;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </spa= n><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def grab(self= , date, **kwargs):</span><br style=3D"font-family: courier new,monospace;">= <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 h= tml =3D self.get_html(date, **kwargs)</span><br style=3D"font-family: couri= er new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 i= f html:</span><br style=3D"font-family: courier new,monospace;"><span style= =3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 = return self.to_xml(self.parse_html(date, html))</span><br style=3D"font-fam= ily: courier new,monospace;"> <br style=3D"font-family: courier new,monospace;"><span style=3D"font-famil= y: courier new,monospace;">class Astro(Grabber):</span><br style=3D"font-fa= mily: courier new,monospace;"><span style=3D"font-family: courier new,monos= pace;">=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 base_url =3D = '<a href=3D"http://www.astro.com.my/channels/%(channel)s/Default.asp">h= ttp://www.astro.com.my/channels/%(channel)s/Default.asp</a>'</span><br = style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 params_dicts = =3D [dict(batch=3D1),</span><br style=3D"font-family: courier new,monospace= ;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 dict(batch=3D2)]</span><br style=3D= "font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 ignores =3D [= 'No Transmission', 'Transmission Ends']</span><br style=3D"= font-family: courier new,monospace;"><span style=3D"font-family: courier ne= w,monospace;">=A0=A0=A0 </span><br style=3D"font-family: courier new,monosp= ace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def __init__(= self, channel):</span><br style=3D"font-family: courier new,monospace;"><sp= an style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 self= .channel =3D channel</span><br style=3D"font-family: courier new,monospace;= "> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 s= elf.url =3D self.base_url % dict(channel=3Dchannel)</span><br style=3D"font= -family: courier new,monospace;"><span style=3D"font-family: courier new,mo= nospace;">=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;= "> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def qs_params= (self, date, **kwargs):</span><br style=3D"font-family: courier new,monospa= ce;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0= =A0 kwargs['sDate'] =3D date.strftime('%d-%b-%Y')</span><br= style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 r= eturn kwargs</span><br style=3D"font-family: courier new,monospace;"><span = style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br style=3D= "font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def _parse_ht= ml(self, date, html):</span><br style=3D"font-family: courier new,monospace= ;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0= =A0 header_row =3D html.find('tr', bgcolor=3D'#29487F')</sp= an><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 f= or tr in header_row.fetchNextSiblings('tr'):</span><br style=3D"fon= t-family: courier new,monospace;"><span style=3D"font-family: courier new,m= onospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 tds =3D tr.findChildren('t= d')</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"><span= style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 title =3D strclean(tds[1].find('a').string)</span><br style= =3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 if title in self.ignores:</span><br style=3D"font-family: cour= ier new,monospace;"><span style=3D"font-family: courier new,monospace;">=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 continue</span><br style=3D"font= -family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"><span= style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 # start time, '21:00' -> 9 PM</span><br style=3D"font-fam= ily: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 hour, minute =3D [int(x) for x in tds[0].string.split(':&#= 39;)]</span><br style=3D"font-family: courier new,monospace;"><span style= =3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 = start =3D datetime.combine(date,</span><br style=3D"font-family: courier ne= w,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 time(hour, minute, tzinfo=3Dtzlocal()))</span><br style=3D"fon= t-family: courier new,monospace;"><span style=3D"font-family: courier new,m= onospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 </span><br style=3D"font-famil= y: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 # duration, '00:30' -> 30 minutes</span><br style= =3D"font-family: courier new,monospace;"><span style=3D"font-family: courie= r new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hours, minutes =3D [int= (x) for x in tds[2].string.split(':')]</span><br style=3D"font-fami= ly: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 stop =3D start + timedelta(hours=3Dhours, minutes=3Dminutes)</= span><br style=3D"font-family: courier new,monospace;"><span style=3D"font-= family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 </span><b= r style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 yield dict(title=3Dtitle, start=3Dstart, stop=3Dstop)</span><b= r style=3D"font-family: courier new,monospace;"><br style=3D"font-family: c= ourier new,monospace;"><span style=3D"font-family: courier new,monospace;">= class TheStar(Grabber):</span><br style=3D"font-family: courier new,monospa= ce;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 base_url =3D '<a href=3D"http://star-ece= ntral.com/tvnradio/tvguide/guide.asp">http://star-ecentral.com/tvnradio/tvg= uide/guide.asp</a>'</span><br style=3D"font-family: courier new,monospa= ce;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 params_dicts = =3D [dict(db=3D'live')]</span><br style=3D"font-family: courier new= ,monospace;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0 = </span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 def qs_params= (self, date, **kwargs):</span><br style=3D"font-family: courier new,monospa= ce;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0= =A0 kwargs['pdate'] =3D date.strftime('%m/%d/%Y')</span><br= style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 k= wargs['chn'] =3D self.channel.replace('rtm', 'tv')<= /span><br style=3D"font-family: courier new,monospace;"><span style=3D"font= -family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 return kwargs</span>= <br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 def _parse_html(self, date, html):</span><br= style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 l= ast_ampm =3D None</span><br style=3D"font-family: courier new,monospace;"><= span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 he= ader_row =3D html.find('tr', bgcolor=3D'#5e789c')</span><br= style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 f= or tr in header_row.fetchNextSiblings('tr'):</span><br style=3D"fon= t-family: courier new,monospace;"><span style=3D"font-family: courier new,m= onospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 tds =3D tr.findChildren('t= d')</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"><span= style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 schedule =3D {}</span><br style=3D"font-family: courier new,monospac= e;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 schedule['title'] =3D strclean(tds[1].find('b'= ).find('font').string)</span><br style=3D"font-family: courier new,= monospace;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 schedule['desc'] =3D strclean(tds[2].find(= 'font').string)</span><br style=3D"font-family: courier new,monospa= ce;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"><span= style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 episode_num =3D strclean(tds[3].find('font').string)</span><= br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 if episode_num:</span><br style=3D"font-family: courier new,mo= nospace;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 try:</span><br style=3D"font-family: cour= ier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 episode_num =3D int(episode_num) - 1</= span><br style=3D"font-family: courier new,monospace;"><span style=3D"font-= family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 episode_num =3D '.' + str(episode_num) + '.'= ;</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 episode_system =3D 'xmltv_ns'<= /span><br style=3D"font-family: courier new,monospace;"><span style=3D"font= -family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 except ValueError:</span><br style=3D"font-family: courier new,monospac= e;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 episode_system =3D 'onscreen'<= /span><br style=3D"font-family: courier new,monospace;"><span style=3D"font= -family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 schedule['episode_num'] =3D episode_num</span><br style=3D"font= -family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 schedule['episode_system'] =3D episode_sys= tem</span><br style=3D"font-family: courier new,monospace;"><span style=3D"= font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 </sp= an><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 # start time, '9.00pm' -> 9 PM</span><br style=3D"f= ont-family: courier new,monospace;"><span style=3D"font-family: courier new= ,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 time_str =3D tds[0].find(= 9;font').string</span><br style=3D"font-family: courier new,monospace;"= > <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 ampm =3D time_str[-2:]</span><br style=3D"font-family: courier= new,monospace;"><span style=3D"font-family: courier new,monospace;">=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0 hour, minute =3D [int(x) for x in time_str[:-2]= .split('.')]</span><br style=3D"font-family: courier new,monospace;= "> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 if ampm =3D=3D 'pm' and hour < 12:</span><br style= =3D"font-family: courier new,monospace;"><span style=3D"font-family: courie= r new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hour +=3D 1= 2</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 elif ampm =3D=3D'am' and hour =3D=3D 12:</span><br sty= le=3D"font-family: courier new,monospace;"><span style=3D"font-family: cour= ier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hour =3D = 0</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"><span= style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 if last_ampm =3D=3D 'pm' and ampm =3D=3D 'am':</span= ><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 date =3D date + timedelta(1)</span><br style=3D"fo= nt-family: courier new,monospace;"><span style=3D"font-family: courier new,= monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 schedule['start'] =3D= datetime.combine(</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 date, time(hour, minute, tzinfo=3Dtzlocal()))</spa= n><br style=3D"font-family: courier new,monospace;"><span style=3D"font-fam= ily: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 last_ampm = =3D ampm</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 </span><br style=3D"font-family: courier new,monospace;"><span= style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0 yield schedule</span><br style=3D"font-family: courier new,monospace= ;"> <br style=3D"font-family: courier new,monospace;"><span style=3D"font-famil= y: courier new,monospace;">def main():</span><br style=3D"font-family: cour= ier new,monospace;"><span style=3D"font-family: courier new,monospace;">=A0= =A0=A0 from optparse import OptionParser</span><br style=3D"font-family: co= urier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 parser =3D OptionParser()</span><br style=3D= "font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 parser.add_op= tion('-s', '--source', dest=3D'source',</span><br s= tyle=3D"font-family: courier new,monospace;"><span style=3D"font-family: co= urier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 help=3D'SOURCE to grab from= : Astro, TheStar. Default: TheStar')</span><br style=3D"font-family: co= urier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 parser.add_op= tion('-d', '--date', dest=3D'date',</span><br style= =3D"font-family: courier new,monospace;"><span style=3D"font-family: courie= r new,monospace;">=A0=A0=A0=A0=A0=A0=A0 help=3D'Start DATE to grab sche= dules for (YYYY-MM-DD). Default: today')</span><br style=3D"font-family= : courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 parser.add_op= tion('-n', '--days', dest=3D'days',</span><br style= =3D"font-family: courier new,monospace;"><span style=3D"font-family: courie= r new,monospace;">=A0=A0=A0=A0=A0=A0=A0 help=3D'Number of DAYS to grab = schedules for. Default: 1')</span><br style=3D"font-family: courier new= ,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 parser.add_op= tion('-f', '--file', dest=3D'filename', metavar=3D&= #39;FILE',</span><br style=3D"font-family: courier new,monospace;"><spa= n style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 help= =3D'Output FILE to write to. Default: stdout')</span><br style=3D"f= ont-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 options, args =3D parser.parse_args()</span>= <br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 if options.source is None:</span><br style= =3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 c= ls =3D TheStar</span><br style=3D"font-family: courier new,monospace;"><spa= n style=3D"font-family: courier new,monospace;">=A0=A0=A0 else:</span><br s= tyle=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 c= ls =3D globals()[options.source]</span><br style=3D"font-family: courier ne= w,monospace;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0= </span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 if options.da= te is None:</span><br style=3D"font-family: courier new,monospace;"><span s= tyle=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 date =3D= dt.today()</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 else:</span><= br style=3D"font-family: courier new,monospace;"><span style=3D"font-family= : courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 date =3D dt(*[int(x) for x = in options.date.split('-')])</span><br style=3D"font-family: courie= r new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 if options.days is None:</span><br style=3D"= font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 d= ays =3D 1</span><br style=3D"font-family: courier new,monospace;"><span sty= le=3D"font-family: courier new,monospace;">=A0=A0=A0 else:</span><br style= =3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 d= ays =3D int(options.days)</span><br style=3D"font-family: courier new,monos= pace;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span= ><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 root =3D etre= e.Element('tv')</span><br style=3D"font-family: courier new,monospa= ce;"><span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><= br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 for channel i= n channels:</span><br style=3D"font-family: courier new,monospace;"><span s= tyle=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 grabber = =3D cls(channel)</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 f= or i in range(days):</span><br style=3D"font-family: courier new,monospace;= "><span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 for params_dict in cls.params_dicts:</span><br style=3D"font-f= amily: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 for elem in grabber.grab(date + timedelta(i), **pa= rams_dict):</span><br style=3D"font-family: courier new,monospace;"><span s= tyle=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0 root.append(elem)</span><br style=3D"font-famil= y: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 </span><br st= yle=3D"font-family: courier new,monospace;"><span style=3D"font-family: cou= rier new,monospace;">=A0=A0=A0 xml =3D etree.tostring(root, encoding=3D'= ;UTF-8', xml_declaration=3DTrue,</span><br style=3D"font-family: courie= r new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 pretty_print=3DTrue)</s= pan><br style=3D"font-family: courier new,monospace;"><span style=3D"font-f= amily: courier new,monospace;">=A0=A0=A0 if options.filename is None:</span= ><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 p= rint xml</span><br style=3D"font-family: courier new,monospace;"><span styl= e=3D"font-family: courier new,monospace;">=A0=A0=A0 else:</span><br style= =3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0=A0=A0=A0=A0 o= pen(options.filename, 'w').write(xml)</span><br style=3D"font-famil= y: courier new,monospace;"><br style=3D"font-family: courier new,monospace;= "><span style=3D"font-family: courier new,monospace;">if __name__ =3D=3D &#= 39;__main__':</span><br style=3D"font-family: courier new,monospace;"> <span style=3D"font-family: courier new,monospace;">=A0=A0=A0 main()</span>= <br style=3D"font-family: courier new,monospace;"><br> --001485f64af0ec4b7804803c61f6-- --===============0910614892== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ XML-SIG maillist - [email protected] http://mail.python.org/mailman/listinfo/xml-sig --===============0910614892==--