Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 1, 2010 23:09:23

offline
От:
Зарегистрирован: 2007-04-24
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

SAX парсинг

Почитал пару туториалов и поглядел сорцы 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 существовать не будет.. Есть ли какой то способ всё таки получить данные или это в принципе так и задумывалось?



Офлайн

#2 Янв. 2, 2010 00:31:51

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

SAX парсинг

Ну передайте в ваш 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: Поставил многоточие. Там все так же, как в исходном варианте



Отредактировано (Янв. 2, 2010 10:29:17)

Офлайн

#3 Янв. 2, 2010 01:30:15

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

SAX парсинг

offline
Ничего не понимаю.

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

Потом, этот код банально некорректный из-за отсутствия инициализации атрибута in_offer



Офлайн

#4 Янв. 2, 2010 10:26:29

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

SAX парсинг

Почему у парсера, если он передается в __init__ хендлера и в методах хендлера и заполняется?
Код не некорректный, а неполный. Я показал суть, не более того.
Посмотрите внимательнее и задавайте вопросы.



Офлайн

#5 Янв. 2, 2010 10:39:00

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

SAX парсинг

Ed
Расслабтесь. Пост был обращен не вам.



Офлайн

#6 Янв. 2, 2010 10:42:14

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

SAX парсинг

О, точно. Блин, нужно меньше пить :)
PS: Но я понял чего автор треда хотел, так что могу ответить, если хотите.



Отредактировано (Янв. 2, 2010 10:43:21)

Офлайн

#7 Янв. 2, 2010 10:56:54

offline
От:
Зарегистрирован: 2007-04-24
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

SAX парсинг

Ed, спасибо, как то забыл что лист это мутэбл объект и его можно изменять где хочешь.



Офлайн

#8 Янв. 2, 2010 11:12:09

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

SAX парсинг

Кстати, можно обойтись и без внешних сущностей, используя только handler:

parser = make_parser()
handler = Handler()
parser.setContentHandler(handler)
parser.parse(open("/path/to/file", "r"))
texts = handler.texts



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version