Форум сайта python.su
Подскажите пожалуйста куда копать.
Есть документ HTML. В основном он состоит из таблиц. Задача состоит в том, чтобы отпарсить его и убрать все лишние теги кроме заданных table, caption, th, tr и td. Также необходимо убрать все атрибуты типа ширина толцина шрифт и пр. Затем работа с базой - во время анализа сознается таблица с именем между <caption>Имя_таблицы</caption> и полями между <th>Имена_полей</th>, и заполняется данными соответственно между тегами <td>Данные</td>
Вот что получилось у меня:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys, pg
from HTMLParser import HTMLParser
inFile=file("/other/shels/status.html", 'r')
outFile=file("/other/shels/parsestatus.html", 'w')
class MyHTMLParser(HTMLParser):
def __init__(self):
self.parseTag=False
HTMLParser.reset(self)
def connection(self, query):
db=pg.connect("dbname='my_base' user='homeuser'")
query=db.query(query)
return query
def handle_starttag(self, tag, attrs):
if (tag == "table"):
self.parseStartTag='<'+tag+'>'
outFile.write(self.parseStartTag)
self.parseTag=True
if (tag == "caption"):
self.parseStartTag='<'+tag+'>'
outFile.write(self.parseStartTag)
self.parseTag=True
if (tag == "th"):
self.parseStartTag='<'+tag+'>'
outFile.write(self.parseStartTag)
self.parseTag=True
if (tag == "tr"):
self.parseStartTag='<'+tag+'>'
outFile.write(self.parseStartTag)
self.parseTag=True
if (tag == "td"):
self.parseStartTag='<'+tag+'>'
outFile.write(self.parseStartTag)
self.parseTag=True
def handle_endtag(self, tag):
if (tag == "table"):
self.parseEndTag='</'+tag+'>'
outFile.write(self.parseEndTag)
if (tag == "caption"):
self.parseEndTag='</'+tag+'>'
outFile.write(self.parseEndTag)
if (tag == "th"):
self.parseEndTag='</'+tag+'>'
outFile.write(self.parseEndTag)
if (tag == "tr"):
self.parseEndTag='</'+tag+'>'
outFile.write(self.parseEndTag)
if (tag == "td"):
self.parseEndTag='</'+tag+'>'
outFile.write(self.parseEndTag)
def handle_data(self, data):
if self.parseTag:
#outFile.write(data)
createQuery='CREATE TABLE %s()' %data
self.connection(createQuery)
if __name__ == '__main__':
parse = MyHTMLParser()
for line in inFile:
parse.feed(line)
Офлайн
прототип такой:
class MyHTMLParser(HTMLParser):
def __init__(self, *args, **kwargs):
self.is_inside_td = False
self.queries = []
super(MyHTMLParser, self).__init__(*args, **kwargs)
def handle_starttag(self, tag, attrs):
if tag == 'td':
self.is_inside_td = True
def handle_endtag(self, tag):
if tag == 'td':
self.is_inside_td = False
def handle_data(self, data):
if self.is_inside_td:
self.queries.append('INSERT .....' % data)
if __name__ == '__main__':
parsed = MyHTMLParser()
if parsed.queries:
#do something with db
pass
Отредактировано (Апрель 11, 2010 23:52:18)
Офлайн
Спасибо. Попробую поколупаться в этом направлении.
Офлайн
Лучше разделить сложную задачу на две простых.
Отдельно парсить текст
например
Beautiful Soup
regular expressions
И отдельно организовать работу с базой данных.
Google в помощь ;)
Офлайн