Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 19, 2015 10:08:01

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

Привет ребят, подскажите пожалуйста.
Есть некий xml из которого забираю name user_id, беда в том, что есть плохие name и те которые обрабатывать не нужно.
как создать и применить список, который не будет обрабатываться при парсинге ?
что имею:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from xml.dom.minidom import *
xml = parse('test.xml')
name = xml.getElementsByTagName('user_id')
for node in name:
    print node.childNodes[0].data.encode('utf-8')

Офлайн

#2 Июнь 19, 2015 10:56:46

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

Критерии “плохости” изложите. А, вообще, что мешает, когда идете по списку в for, делать проверку и пропускать ненужные?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Июнь 19, 2015 14:39:58

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

PooH
Критерии “плохости” изложите. А, вообще, что мешает, когда идете по списку в for, делать проверку и пропускать ненужные?
user_id bad = ;$*asd@
я новичок в этом деле
как продолжить код, чтобы пропускать user_id bad который содержится в другом файле user_bad ?

Офлайн

#4 Июнь 19, 2015 17:24:41

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

for node in name:
    user_id = node.childNodes[0].data.encode('utf-8')
    if is_bad(user_id):
        continue
    print user_id

или

for node in name:
    user_id = node.childNodes[0].data.encode('utf-8')
    if not is_bad(user_id):
        print user_id

Функция is_bad получает user_id и возвращает True если он плохой и False в противном случае. Если список плохих id читается из файла можно сделать типа такого:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from xml.dom.minidom import *
 
class IdTester(object):
    def __init__(self, filename):
        with open(filename) as inf:
            self.bad_ids = {s: True for s in inf.readlines()}
     
    def is_bad(self, key):
        return key in self.bad_ids
 
 
xml = parse('test.xml')
name = xml.getElementsByTagName('user_id')
tester = IdTester('user_bad')
for node in name:
     user_id = node.childNodes[0].data.encode('utf-8')
     if not tester.is_bad(user_id):
         print user_id



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Июнь 19, 2015 17:25:40)

Офлайн

#5 Июнь 20, 2015 13:03:48

papuas
Зарегистрирован: 2015-06-19
Сообщения: 159
Репутация: +  6  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

File "./unknow.py", line 8
    self.bad_ids = {s: True for s in inf.readlines()}
^

Офлайн

#6 Июнь 21, 2015 09:26:33

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

Древний питон?, попробуйте так

self.bad_ids = dict(map(lambda x: (x, True), inf.readlines()))



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Июнь 21, 2015 10:37:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

PooH
self.bad_ids = dict(map(lambda x: (x, True), inf.readlines()))
>>> dict.fromkeys('abc', True)
{'c': True, 'b': True, 'a': True}
>>>



Офлайн

#8 Июнь 21, 2015 11:19:12

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

py.user.next
>>> dict.fromkeys('abc', True)
уел :)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Июнь 21, 2015 11:32:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

парсинг xml с фильтром из белого списка

Надеюсь, readlines() тоже не будешь делать, так как файловый поток - сам по себе итератор.

>>> dict.fromkeys(open('/etc/issue'), True)
{'\n': True, 'Fedora release 20 (Heisenbug)\n': True, 'Kernel \\r on an \\m (\\l)\n': True}
>>>



Отредактировано py.user.next (Июнь 21, 2015 11:37:34)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version