Почалося все з того, що в мене була купа роботи, але мені чомусь кортіло затягти RSS стрічку УНІАН на свою книжкочиталку. Накатав отакий на половину небоєздатний скрипт.
#!/usr/bin/python
# -*- coding: utf-8 -*-
# (c) me
from sys import argv,exit
def items(s,its='<item>',ite='</item>'):
itsl=len(its)
itel=len(ite)
st=s.find(its)
res=[]
while st>=0:
st+=itsl
en=s.find(ite,st)
res.append(s[st:en])
st=s.find(its,en+itel)
return res
def xmprint(s,htm=False):
res='<section>'
start=s.find("<H1>")
end=s.find('</div>',start)
for i in items(s[start:end],'<H1>','</H1>'):
if htm:
res+='<h1>'+i+'</h1>'
else:
res+='<title><p>'+i+'</p></title>\n'
st=s.find("<P>",start)
while st<end and st >0:
np=s.find("</P>",st+3)
np1=s.find("<P>",st+3)
if np>np1 and np1>0: np=np1
string=s[st+3:np]
res+='<p>'+string+'</p>\n'
st=s.find("<P>",np)
# for i in items(s,'<P>','</P>'):
# res+='<p>'+i+'</p>\n'
return res+'</section>'
IfHTML='-htm' in argv
import urllib2
resp=urllib2.urlopen('http://rss.unian.net/site/news_ukr.rss')
txt=resp.read()
lnks=[]
for i in items(txt):
lnk=i[i.find('<link>')+6:i.find('</link>')]
lnks.append(lnk)
strh="""<?xml version="1.0" encoding="windows-1251"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
<description>
<title-info>
<genre>comp_www</genre>
<author><first-name>UNIAN 2 fb2</first-name></author>
<book-title>UNIAN Info</book-title>
<lang>uk</lang>
</title-info>
<document-info>
<author><first-name>UNIAN 2 fb2</first-name></author>
<date>%date%</date>
<id>%id%</id>
<version>0.1</version>
</document-info>
</description>
<body>
"""
stre='</body></FictionBook>'
#print strh+xmt.replace(" "," ")+stre
if IfHTML:
ouf=open("UNIAN.htm","w")
ouf.write("<html><head><title>UNIAN</title></head><body>\n")
else:
ouf=open("UNIAN.fb2","w")
ouf.write(strh)
for i in xrange(len(lnks)):
print "(%d/%d) %s"%(i+1,len(lnks),lnks[i])
htext=urllib2.urlopen(lnks[i])
xmt= xmprint(htext.read(),IfHTML)
ouf.write(xmt.replace(" "," "))
if IfHTML:
ouf.write('</body></html>')
else:
ouf.write(stre)
ouf.close()
Спочатку планувалось, що сіє диво видасть результуючий fb2 дива не сталось: результуючий файл не проходив валідацію. Замість того, щоб вивчати бібліотеку парсіння HTML (ох і плутають теги ті УНІАНівські писаки: "
<p><em>bla - bla <p></em>...").
Зрештою, книжкочиталка сама HTML тямить читати - скористався цією фічею і присобачив скрипту опцію "-htm" - з нею працює безвідмовно
Якщо хтось є щасливим власником читалки, яка не тямить HTML (але розуміє fb2) та ще хоче читати з неї стрічку новин від УНІАН - пропоную присобачити код для парсіння HTML - тегів і вивішати тут