Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 19, 2013 07:31:52

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

перегрузка класса

Всех приветствую!
понадобилось распарсить xml файл, при помощи Expat, в стандартной доке пример применения:

import xml.parsers.expat

# 3 handler functions
def start_element(name, attrs):
print 'Start element:', name, attrs
def end_element(name):
print 'End element:', name
def char_data(data):
print 'Character data:', repr(data)

p = xml.parsers.expat.ParserCreate()

p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)
так вот, у меня вопрос, можно ли перегрузить класс ParseCreate(), и чтобы было типа как в модуле HTMLParser, на что то вроде:
# create a subclass and override the handler methods
class MyParser(xml.parsers.expat.ParserCreate()):
def __init__(self):
path = ""
def StartElementHandler(self, tag, attrs):
print tag
# instantiate the parser and fed it some HTML

parser = MyParser()
parser.Parse(out)
Здесь у меня выскакивает ошибка
Traceback (most recent call last):
File "D:\doorways\seo.py", line 13, in <module>
class MyParser(xml.parsers.expat.ParserCreate()):
TypeError: Error when calling the metaclass bases
cannot create 'pyexpat.xmlparser' instances
Для продолжения нажмите любую клавишу . . .



Офлайн

#2 Янв. 19, 2013 08:36:08

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

перегрузка класса

а это и не класс вовсе

from HTMLParser import HTMLParser
from xml.parsers.expat import ParserCreate
print type(HTMLParser)
print type(ParserCreate)

output:
<type 'classobj'>
<type 'builtin_function_or_method'>
получилось сделать вот так:
from xml.parsers.expat import ParserCreate

class MyParser:
def __init__(self):
self.p = ParserCreate()
self.p.StartElementHandler = self.start_element

def start_element(self, tag, attrs):
print tag

def feed(self, data):
self.p.Parse(data, 1)

# instantiate the parser and fed it some HTML

parser = MyParser()
parser.feed(data)



Отредактировано lobster (Янв. 19, 2013 08:36:39)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version