<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Generov%C3%A1n%C3%AD_FAQ_z_wiki_%28Python%29</id>
	<title>Generování FAQ z wiki (Python) - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Generov%C3%A1n%C3%AD_FAQ_z_wiki_%28Python%29"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Generov%C3%A1n%C3%AD_FAQ_z_wiki_(Python)&amp;action=history"/>
	<updated>2026-06-02T21:56:18Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Generov%C3%A1n%C3%AD_FAQ_z_wiki_(Python)&amp;diff=365&amp;oldid=prev</id>
		<title>130.225.61.3 v 1. 11. 2007, 09:40</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Generov%C3%A1n%C3%AD_FAQ_z_wiki_(Python)&amp;diff=365&amp;oldid=prev"/>
		<updated>2007-11-01T09:40:30Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Pavouk v Pythonu, který z FAQ na wiki vygeneruje FAQ v html v Bruceově formátu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## coding: UTF-8&lt;br /&gt;
import urllib2&lt;br /&gt;
import sgmllib&lt;br /&gt;
from sets import Set&lt;br /&gt;
import re&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
# Parser položky FAQ. Musí odfiltrovat wiki balast .. inside_c,&lt;br /&gt;
# přeskočit případně vloženou tabulku s obsahem .. skip_toc&lt;br /&gt;
class ParserItem(sgmllib.SGMLParser):&lt;br /&gt;
    def reset(self):&lt;br /&gt;
        sgmllib.SGMLParser.reset(self)&lt;br /&gt;
        self.flags = Set([])&lt;br /&gt;
&lt;br /&gt;
    def start_div(self,attrs):&lt;br /&gt;
        id = [v for k, v in attrs if k == &amp;#039;id&amp;#039;]&lt;br /&gt;
        classv = [v for k, v in attrs if k == &amp;#039;class&amp;#039;]&lt;br /&gt;
        if id and id[0] == &amp;quot;contentSub&amp;quot;:&lt;br /&gt;
            self.flags.add(&amp;#039;content&amp;#039;)&lt;br /&gt;
        if classv and classv[0] == &amp;quot;printfooter&amp;quot;:&lt;br /&gt;
            self.flags.discard(&amp;#039;content&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    def end_div(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    def end_td(self):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            self.fags.discard(&amp;#039;td&amp;#039;)&lt;br /&gt;
            sys.stdout.write(&amp;quot;&amp;lt;/td&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def start_h3(self, data):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            self.flags.add(&amp;#039;h3&amp;#039;)&lt;br /&gt;
            sys.stdout.write(&amp;quot;&amp;lt;h4&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def end_h3(self):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            self.flags.discard(&amp;#039;h3&amp;#039;)&lt;br /&gt;
            sys.stdout.write(&amp;quot;&amp;lt;/h4&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def start_table(self, attrs):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            id = [v for k, v in attrs if k == &amp;#039;id&amp;#039;]&lt;br /&gt;
            if id and id[0] == &amp;quot;toc&amp;quot;:&lt;br /&gt;
                self.flags.add(&amp;#039;skip_toc&amp;#039;)&lt;br /&gt;
                self.flags.discard(&amp;#039;content&amp;#039;)&lt;br /&gt;
            else:&lt;br /&gt;
                print &amp;quot;&amp;lt;table border=\&amp;quot;0\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
            &lt;br /&gt;
    def end_table(self):&lt;br /&gt;
        if &amp;#039;skip_toc&amp;#039; in self.flags:&lt;br /&gt;
            self.flags.discard(&amp;#039;skip_toc&amp;#039;)&lt;br /&gt;
            self.flags.add(&amp;#039;content&amp;#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
                print &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # Párové tagy &amp;lt;pre&amp;gt; a &amp;lt;p&amp;gt; nesou zajímavý obsah &lt;br /&gt;
    def unknown_starttag(self, tag, attrs):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            sys.stdout.write(&amp;quot;&amp;lt;%s&amp;gt;&amp;quot; % tag)&lt;br /&gt;
            if tag in [&amp;#039;pre&amp;#039;,&amp;#039;p&amp;#039;,&amp;#039;li&amp;#039;,&amp;#039;td&amp;#039;]:&lt;br /&gt;
                self.flags.add(tag)&lt;br /&gt;
&lt;br /&gt;
    def unknown_endtag(self, tag):         &lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            print &amp;quot;&amp;lt;/%s&amp;gt;&amp;quot; % tag&lt;br /&gt;
            if tag in [&amp;#039;pre&amp;#039;,&amp;#039;p&amp;#039;,&amp;#039;li&amp;#039;,&amp;#039;td&amp;#039;]:&lt;br /&gt;
                self.flags.discard(tag)&lt;br /&gt;
&lt;br /&gt;
    def handle_data(self, data):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            if len(Set([&amp;#039;pre&amp;#039;,&amp;#039;p&amp;#039;,&amp;#039;li&amp;#039;,&amp;#039;td&amp;#039;]) &amp;amp; self.flags) &amp;gt; 0:&lt;br /&gt;
                sys.stdout.write(data)&lt;br /&gt;
&lt;br /&gt;
    def start_a(self, attrs):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            href = [v for k, v in attrs if k == &amp;#039;href&amp;#039;]&lt;br /&gt;
            title = [v for k, v in attrs if k == &amp;#039;title&amp;#039;]&lt;br /&gt;
            if title and re.match(&amp;#039;^Edit&amp;#039;, title[0]):&lt;br /&gt;
                self.flags.add(&amp;#039;skip_close_a&amp;#039;)&lt;br /&gt;
            else:&lt;br /&gt;
                if title and href:&lt;br /&gt;
                    self.flags.add(&amp;#039;a&amp;#039;)&lt;br /&gt;
                    sys.stdout.write(&amp;quot;&amp;lt;a href=\&amp;quot;%s\&amp;quot; title=\&amp;quot;%s\&amp;quot;&amp;gt;&amp;quot; % (href[0], title[0]))&lt;br /&gt;
&lt;br /&gt;
    def end_a(self):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            self.flags.discard(&amp;#039;a&amp;#039;)&lt;br /&gt;
            if &amp;#039;skip_close_a&amp;#039; in self.flags: &lt;br /&gt;
                self.flags.discard(&amp;#039;skip_close_a&amp;#039;)&lt;br /&gt;
            else:&lt;br /&gt;
                sys.stdout.write(&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parser hlavní stránky. V podstatě jenom filtruje odkazy&lt;br /&gt;
# začínající číslicí a skrz regulární výrazy z nich dělá nadpisy.&lt;br /&gt;
# Pro každý identifikovaný odkaz spustí načtení detailu FAQ&lt;br /&gt;
class ParserMainPage(sgmllib.SGMLParser):&lt;br /&gt;
    def reset(self):&lt;br /&gt;
        sgmllib.SGMLParser.reset(self)&lt;br /&gt;
        self.inside_h1 = 0&lt;br /&gt;
&lt;br /&gt;
    def start_h1(self, data):&lt;br /&gt;
        self.inside_h1 = 1&lt;br /&gt;
&lt;br /&gt;
    def end_h1(self):&lt;br /&gt;
        self.inside_h1 = 0&lt;br /&gt;
&lt;br /&gt;
    def handle_data(self, data):&lt;br /&gt;
        if self.inside_h1:&lt;br /&gt;
            if re.match(&amp;#039;^\d&amp;#039;, data):&lt;br /&gt;
                print &amp;quot;&amp;lt;hr&amp;gt;&amp;quot;&lt;br /&gt;
                print &amp;quot;&amp;lt;h2 align=\&amp;quot;center\&amp;quot;&amp;gt;%s&amp;lt;/h2&amp;gt;&amp;quot; % re.sub(&amp;#039;\d\. &amp;#039;,&amp;#039;&amp;#039;,data)&lt;br /&gt;
&lt;br /&gt;
    def start_a(self, attrs):&lt;br /&gt;
        href = [v for k, v in attrs if k == &amp;#039;href&amp;#039;]&lt;br /&gt;
        title = [v for k, v in  attrs if k == &amp;#039;title&amp;#039;]&lt;br /&gt;
        if title and re.match(&amp;#039;^\d\.&amp;#039;,title[0]):&lt;br /&gt;
            if re.match(&amp;#039;(\d)\.0?(\d{1,2})+(\.\d)&amp;#039;, title[0]):&lt;br /&gt;
                print &amp;quot;&amp;lt;h3&amp;gt;%s&amp;lt;/h3&amp;gt;&amp;quot; % re.sub(&amp;#039;(\d)\.0?(\d{1,2})+(\.\d)&amp;#039;,&amp;#039;&amp;lt;a name=&amp;quot;item\\1.\\2\\3&amp;quot;&amp;gt;\\1.\\2\\3&amp;lt;/a&amp;gt;)&amp;#039;, title[0])&lt;br /&gt;
            else:&lt;br /&gt;
                print &amp;quot;&amp;lt;h3&amp;gt;%s&amp;lt;/h3&amp;gt;&amp;quot; % re.sub(&amp;#039;(\d)\.0?(\d{1,2})+&amp;#039;,&amp;#039;&amp;lt;a name=&amp;quot;item\\1.\\2&amp;quot;&amp;gt;\\1.\\2&amp;lt;/a&amp;gt;)&amp;#039;, title[0])&lt;br /&gt;
            iresp = urllib2.urlopen(&amp;quot;http://www.pgsql.cz&amp;quot; + href[0])&lt;br /&gt;
            item = iresp.read()&lt;br /&gt;
            iresp.close()&lt;br /&gt;
            parserItem = ParserItem()&lt;br /&gt;
            parserItem.feed(item)&lt;br /&gt;
            parserItem.close()&lt;br /&gt;
&lt;br /&gt;
# Parsuje odstavce v FAQ (metainformace) a seznam otázek&lt;br /&gt;
# uvedený na začátku FAQ&lt;br /&gt;
class ParserMainPageProlog(sgmllib.SGMLParser):&lt;br /&gt;
    def reset(self):&lt;br /&gt;
        sgmllib.SGMLParser.reset(self)&lt;br /&gt;
        self.flags = Set([])&lt;br /&gt;
&lt;br /&gt;
    def start_div(self,attrs):&lt;br /&gt;
        id = [v for k, v in attrs if k == &amp;#039;id&amp;#039;]&lt;br /&gt;
        classv = [v for k, v in attrs if k == &amp;#039;class&amp;#039;]&lt;br /&gt;
        if id and id[0] == &amp;quot;contentSub&amp;quot;:&lt;br /&gt;
            self.flags.add(&amp;#039;content&amp;#039;)&lt;br /&gt;
        if classv and classv[0] == &amp;quot;printfooter&amp;quot;:&lt;br /&gt;
            self.flags.discard(&amp;#039;content&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    def end_div(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    def unknown_starttag(self, tag, attrs):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            sys.stdout.write(&amp;quot;&amp;lt;%s&amp;gt;&amp;quot; % tag)&lt;br /&gt;
            if tag in [&amp;#039;p&amp;#039;]:&lt;br /&gt;
                self.flags.add(tag)&lt;br /&gt;
&lt;br /&gt;
    def unknown_endtag(self, tag):         &lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            sys.stdout.write(&amp;quot;&amp;lt;/%s&amp;gt;&amp;quot; % tag)&lt;br /&gt;
            if tag in [&amp;#039;p&amp;#039;]:&lt;br /&gt;
                self.flags.discard(tag)&lt;br /&gt;
&lt;br /&gt;
    def start_h1(self, data):&lt;br /&gt;
        self.flags.add(&amp;#039;h1&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    def end_h1(self):&lt;br /&gt;
        self.flags.discard(&amp;#039;h1&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    def handle_data(self, data):&lt;br /&gt;
        if &amp;#039;h1&amp;#039; in self.flags:&lt;br /&gt;
            if re.match(&amp;#039;^\d&amp;#039;, data):&lt;br /&gt;
                if re.match(&amp;#039;1&amp;#039;, data):&lt;br /&gt;
                    print &amp;quot;&amp;lt;hr&amp;gt;&amp;quot;&lt;br /&gt;
                print &amp;quot;&amp;lt;h2 align=\&amp;quot;center\&amp;quot;&amp;gt;%s&amp;lt;/h2&amp;gt;&amp;quot; % re.sub(&amp;#039;\d\. &amp;#039;,&amp;#039;&amp;#039;,data)&lt;br /&gt;
        else:&lt;br /&gt;
            if &amp;#039;p&amp;#039; in self.flags:&lt;br /&gt;
                sys.stdout.write(data)&lt;br /&gt;
&lt;br /&gt;
    def start_a(self, attrs):&lt;br /&gt;
        href = [v for k, v in attrs if k == &amp;#039;href&amp;#039;]&lt;br /&gt;
        title = [v for k, v in  attrs if k == &amp;#039;title&amp;#039;]&lt;br /&gt;
        if title and re.match(&amp;#039;^\d\.&amp;#039;,title[0]):&lt;br /&gt;
            if re.match(&amp;#039;(\d)\.0?(\d{1,2})+(\.\d)&amp;#039;, title[0]):&lt;br /&gt;
                print &amp;quot;%s&amp;lt;br&amp;gt;&amp;quot; % re.sub(&amp;#039;(\d)\.0?(\d{1,2})+(\.\d)&amp;#039;,&amp;#039;&amp;lt;a href=&amp;quot;#item\\1.\\2\\3&amp;quot;&amp;gt;\\1.\\2\\3&amp;lt;/a&amp;gt;)&amp;#039;, title[0])&lt;br /&gt;
            else:&lt;br /&gt;
                print &amp;quot;%s&amp;lt;br&amp;gt;&amp;quot; % re.sub(&amp;#039;(\d)\.0?(\d{1,2})+&amp;#039;,&amp;#039;&amp;lt;a href=&amp;quot;#item\\1.\\2&amp;quot;&amp;gt;\\1.\\2&amp;lt;/a&amp;gt;)&amp;#039;, title[0])&lt;br /&gt;
            self.flags.add(&amp;#039;skip_close_a&amp;#039;)&lt;br /&gt;
        elif title and re.match(&amp;#039;^Edit&amp;#039;, title[0]):&lt;br /&gt;
            self.flags.add(&amp;#039;skip_close_a&amp;#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            if title and href and &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
                self.flags.add(&amp;#039;a&amp;#039;)&lt;br /&gt;
                sys.stdout.write(&amp;quot;&amp;lt;a href=\&amp;quot;%s\&amp;quot; title=\&amp;quot;%s\&amp;quot;&amp;gt;&amp;quot; % (href[0], title[0]))&lt;br /&gt;
&lt;br /&gt;
    def end_a(self):&lt;br /&gt;
        if &amp;#039;content&amp;#039; in self.flags:&lt;br /&gt;
            self.flags.discard(&amp;#039;a&amp;#039;)&lt;br /&gt;
            if &amp;#039;skip_close_a&amp;#039; not in self.flags:&lt;br /&gt;
                sys.stdout.write(&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                self.flags.discard(&amp;#039;skip_close_a&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    def start_ul(self, data):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    def start_li(self, data):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    def end_ul(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    def end_li(self):&lt;br /&gt;
        pass &lt;br /&gt;
&lt;br /&gt;
    def end_div(self):&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
response = urllib2.urlopen(&amp;quot;http://www.pgsql.cz/index.php/Frequently_Asked_Questions&amp;quot;)&lt;br /&gt;
html = response.read()&lt;br /&gt;
response.close()&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;&amp;lt;!DOCTYPE HTML PUBLIC \&amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;html&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;head&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;title&amp;gt;PostgreSQL FAQ&amp;lt;/title&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;meta http-equiv=\&amp;quot;Content-Type\&amp;quot; content=\&amp;quot;text/html; charset=utf-8\&amp;quot; /&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;meta http-equiv=\&amp;quot;Content-language\&amp;quot; content=\&amp;quot;cs\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;meta name=\&amp;quot;description\&amp;quot; lang=\&amp;quot;en\&amp;quot; content=\&amp;quot;Czech translation of FAQ for PostgreSQL\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;meta name=\&amp;quot;description\&amp;quot; lang=\&amp;quot;cs\&amp;quot; content=\&amp;quot;Český překlad FAQ PostgreSQL\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;/head&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;body bgcolor=\&amp;quot;#ffffff\&amp;quot; text=\&amp;quot;#000000\&amp;quot; link=\&amp;quot;#ff0000\&amp;quot; vlink=\&amp;quot;#a00000\&amp;quot; alink=\&amp;quot;#0000ff\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;h1&amp;gt;Frequently Asked Questions&amp;lt;/h1&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
parser2 = ParserMainPageProlog()&lt;br /&gt;
parser2.short_run = 0&lt;br /&gt;
parser2.feed(html)&lt;br /&gt;
parser2.close()&lt;br /&gt;
&lt;br /&gt;
parser = ParserMainPage()&lt;br /&gt;
parser.feed(html)&lt;br /&gt;
parser.close()&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;br /&gt;
print &amp;quot;&amp;lt;/htm&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>130.225.61.3</name></author>
	</entry>
</feed>