Форум сайта python.su
Почитал пару туториалов и поглядел сорцы SAX'a, но так и не понял, можно ли из хендлера что то вернуть обратно? Например я хочу достать текст из элементов <offer>
class Handler(ContentHandler):
def __init__(self):
ContentHandler.__init__(self)
self.texts = []
self.data = None
def startElement(self, name, attrs):
if name == "offer":
self.in_offer = True
self.data = ""
def characters(self, data):
if self.in_offer:
self.data += data
def endElement(self, name):
if name == "offer":
self.in_offer = False
self.texts.append(self.data)
parser = make_parser()
parser.setContentHandler(Handler())
parser.parse(open("/path/to/file", "r"))
texts = parser.texts
Офлайн
Ну передайте в ваш Handler уже существующий список, делов-то:
class Handler(ContentHandler):
def __init__(self, texts):
ContentHandler.__init__(self)
self.texts = texts
...
texts = []
parser.setContentHandler(Handler(texts))
parser.parse(open("/path/to/file", "r"))
print texts
Отредактировано (Янв. 2, 2010 10:29:17)
Офлайн
offline
Ничего не понимаю.
Откуда у парсера будет атрибут texts? Он есть у хедлера. Там и будут данные.
Потом, этот код банально некорректный из-за отсутствия инициализации атрибута in_offer
Офлайн
Почему у парсера, если он передается в __init__ хендлера и в методах хендлера и заполняется?
Код не некорректный, а неполный. Я показал суть, не более того.
Посмотрите внимательнее и задавайте вопросы.
Офлайн
Ed
Расслабтесь. Пост был обращен не вам.
Офлайн
О, точно. Блин, нужно меньше пить :)
PS: Но я понял чего автор треда хотел, так что могу ответить, если хотите.
Отредактировано (Янв. 2, 2010 10:43:21)
Офлайн
Ed, спасибо, как то забыл что лист это мутэбл объект и его можно изменять где хочешь.
Офлайн
Кстати, можно обойтись и без внешних сущностей, используя только handler:
parser = make_parser()
handler = Handler()
parser.setContentHandler(handler)
parser.parse(open("/path/to/file", "r"))
texts = handler.texts
Офлайн