Найти - Пользователи
Полная версия: SAX парсинг
Начало » Python для новичков » SAX парсинг
1
offline
Почитал пару туториалов и поглядел сорцы 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
проблема в том что parser не возвращает вроде ничего и поэтому parser.texts существовать не будет.. Есть ли какой то способ всё таки получить данные или это в принципе так и задумывалось?
Ed
Ну передайте в ваш 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
PS: Поставил многоточие. Там все так же, как в исходном варианте
Александр Кошелев
offline
Ничего не понимаю.

Откуда у парсера будет атрибут texts? Он есть у хедлера. Там и будут данные.

Потом, этот код банально некорректный из-за отсутствия инициализации атрибута in_offer
Ed
Почему у парсера, если он передается в __init__ хендлера и в методах хендлера и заполняется?
Код не некорректный, а неполный. Я показал суть, не более того.
Посмотрите внимательнее и задавайте вопросы.
Александр Кошелев
Ed
Расслабтесь. Пост был обращен не вам.
Ed
О, точно. Блин, нужно меньше пить :)
PS: Но я понял чего автор треда хотел, так что могу ответить, если хотите.
offline
Ed, спасибо, как то забыл что лист это мутэбл объект и его можно изменять где хочешь.
Ed
Кстати, можно обойтись и без внешних сущностей, используя только handler:
parser = make_parser()
handler = Handler()
parser.setContentHandler(handler)
parser.parse(open("/path/to/file", "r"))
texts = handler.texts
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