Найти - Пользователи
Полная версия: HTMLParser и PostgreSQL
Начало » Python для новичков » HTMLParser и PostgreSQL
1
Lavel
Подскажите пожалуйста куда копать.
Есть документ 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(), то только только данные без проверки условий. Подскажите куда думать?
denz
прототип такой:

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
Lavel
Спасибо. Попробую поколупаться в этом направлении.
Yurietc
Лучше разделить сложную задачу на две простых.
Отдельно парсить текст
например
Beautiful Soup
regular expressions
И отдельно организовать работу с базой данных.
Google в помощь ;)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB