Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2010 21:31:12

Lavel
От:
Зарегистрирован: 2010-04-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

HTMLParser и PostgreSQL

Подскажите пожалуйста куда копать.
Есть документ 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)
Т.е. документ парсится вроде нормально, все лишнее выбрасывается, но вот куда вставить проверку условий для БД я понять не могу. Если вставлять в функцию hadle_starttag(), то можно вытащить оттуда только имя текущего тега, если в handle_data(), то только только данные без проверки условий. Подскажите куда думать?



Офлайн

#2 Апрель 11, 2010 23:50:21

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

HTMLParser и PostgreSQL

прототип такой:

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)

Офлайн

#3 Апрель 12, 2010 08:47:42

Lavel
От:
Зарегистрирован: 2010-04-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

HTMLParser и PostgreSQL

Спасибо. Попробую поколупаться в этом направлении.



Офлайн

#4 Апрель 12, 2010 17:42:49

Yurietc
От:
Зарегистрирован: 2007-07-18
Сообщения: 112
Репутация: +  0  -
Профиль   Отправить e-mail  

HTMLParser и PostgreSQL

Лучше разделить сложную задачу на две простых.
Отдельно парсить текст
например
Beautiful Soup
regular expressions
И отдельно организовать работу с базой данных.
Google в помощь ;)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version