Найти - Пользователи
Полная версия: парсинг xml с фильтром из белого списка
Начало » Python для новичков » парсинг xml с фильтром из белого списка
1
papuas
Привет ребят, подскажите пожалуйста.
Есть некий 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')
PooH
Критерии “плохости” изложите. А, вообще, что мешает, когда идете по списку в for, делать проверку и пропускать ненужные?
papuas
PooH
Критерии “плохости” изложите. А, вообще, что мешает, когда идете по списку в for, делать проверку и пропускать ненужные?
user_id bad = ;$*asd@
я новичок в этом деле
как продолжить код, чтобы пропускать user_id bad который содержится в другом файле user_bad ?
PooH
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
papuas
File "./unknow.py", line 8
    self.bad_ids = {s: True for s in inf.readlines()}
^
PooH
Древний питон?, попробуйте так
self.bad_ids = dict(map(lambda x: (x, True), inf.readlines()))
py.user.next
PooH
self.bad_ids = dict(map(lambda x: (x, True), inf.readlines()))
>>> dict.fromkeys('abc', True)
{'c': True, 'b': True, 'a': True}
>>>
PooH
py.user.next
>>> dict.fromkeys('abc', True)
уел :)
py.user.next
Надеюсь, readlines() тоже не будешь делать, так как файловый поток - сам по себе итератор.
>>> dict.fromkeys(open('/etc/issue'), True)
{'\n': True, 'Fedora release 20 (Heisenbug)\n': True, 'Kernel \\r on an \\m (\\l)\n': True}
>>>
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