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