いもげスレtoXML

PHPPythonの勉強を兼ねて、id:vert771さんのコード(http://imgscraper.sourceforge.jp/)をPython(3.1)に置き換えて見た。
正規表現とか文字コードとか色々適当です。うげえ。
きっともっと効率のよいやり方があるはず。あと'>'の処理も適当。本文抽出も適当。この実装だと下の広告までひっかかるけど、無視してる。こんなやり方駄目だよねー。

  • 書いてて思ったこと
    • PHP知らなくても何となくで今回は読めた
    • Python 3.x系からurllibとurllib2が統合されたのは良いこと
    • cp932とかutf-8とか文字コードまわりは良くわかんね
    • bytes型をファイルに書き込むときはcodecs.open()を使う・・・でいいんだよね?
import urllib.request
import urllib.error
import re
import codecs
import html.parser

class Stripper(html.parser.HTMLParser):
    def __init__(self):
        html.parser.HTMLParser.__init__(self)

    def strip(self, some_html):
        self.theString = ""
        self.feed(some_html)
        self.close()
        return self.theString

    def handle_data(self, data):
        self.theString += data
    
class ImgScraper:
    def __init__(self, url):
        self.url = url
    
    def translate(self):
        disp = ""
        
        try: response = urllib.request.urlopen(self.url)
        except urllib.error.URLError as e:
            print (e)
            return 0
        src = response.read().decode('cp932')
        
        disp += "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
        disp += "<feed>\n"

        if (src != ""):
            disp += "<url>%s</url>\n" % (url)
             
                         
            #imgにいる人数を抽出
            visitor = re.findall("現在([0-9]+)人くらいが見てます", src)
            disp += "<visitor>%s</visitor>\n" % (visitor[0])

            #スレが消える時間を抽出
            del_time = re.findall("([0-9]{2}):([0-9]{2})頃消えます", src)
            disp += "<vanish_time>%s:%s</vanish_time>\n" % (del_time[0][0], del_time[0][1])
         
            #スレ画像のファイル名を抽出
            pict = re.findall("画像ファイル名:.+([0-9]{13}\.jpg|\.gif|\.png)", src)
            disp += "<picture>http://feb.2chan.net/img/b/src/%s</picture>\n" % (pict[0])

            #スレの立った時間・番号を抽出
            hd = re.findall("([0-9]{2}\/[0-9]{2}\/[0-9]{2})\((.+)\)([0-9]{2}:[0-9]{2}:[0-9]{2}).+No\.([0-9]{8})", src)
            
            #レスの内容を抽出
            tpict = []
            stripper = Stripper()
            for i in re.findall("\<blockquote\>(.+)\<\/blockquote\>", src):
                i = re.sub("\<br\>", "\n", i)
                i = re.sub("&gt;", "hoge", i)
                tpict.append(stripper.strip(i))
                pass
            
            for i in range(len(hd)):
                disp += "<res>\n";
                #レスされた日付
                disp += "<date>%s</date>\n" % (hd[i][0])
                #レスされた曜日
                disp += "<week>%s</week>\n" % (hd[i][1])
                #レスされた時間
                disp += "<time>%s</time>\n" % (hd[i][2])
                #レス番号
                disp += "<number>%s</number>\n" % (hd[i][3])
                #レスのメール欄の内容
                ml = re.findall("name=%s value=delete\>\<a href=\"mailto:(.+)\"\"\>" % (hd[i][3]), src)
                if ml:
                    disp += "<mail>%s</mail>\n" % (ml[0])
                    pass
                else:
                    disp += "<mail></mail>\n"
                    pass
                
                #レスの本文
                tpict[i] = re.sub("hoge", ">", tpict[i])
                disp += "<comment>%s</comment>\n" % tpict[i]
                #ここで記述終了
                disp += "</res>\n";
                pass
            
            disp += "</feed>"
            pass
        
        return disp

if __name__ == "__main__":
    url = てきとうなURL
    hoge = ImgScraper(url)
    test = hoge.translate()
    if test:
        f = codecs.open("test.xml", "w", "utf-8")
        f.write(test)
        f.close()