• Как вывести нужные данные с XML файла Python скриптом?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    from lxml import etree
    
    xml = '''ВАШ XML'''
    
    parser = etree.XMLParser(
        encoding='utf-8',
        recover=True,
    )
    root = etree.fromstring(xml.encode(), parser=parser)
    address = root.xpath('.//address')[0].get('addr')
    cpe = root.xpath('.//cpe')
    for im in cpe:
        print(f'{address} : {im.text}')

    45.33.49.119 : cpe:/h:hp:p2000_g3
    45.33.49.119 : cpe:/o:linux:linux_kernel:2.6.32
    45.33.49.119 : cpe:/o:linux:linux_kernel:2.6
    45.33.49.119 : cpe:/o:linux:linux_kernel:3
    45.33.49.119 : cpe:/o:linux:linux_kernel:2.6.32
    45.33.49.119 : cpe:/h:ubnt:airmax_nanostation
    45.33.49.119 : cpe:/o:linux:linux_kernel:3.7
    45.33.49.119 : cpe:/o:linux:linux_kernel:2.6
    45.33.49.119 : cpe:/o:linux:linux_kernel:3
    45.33.49.119 : cpe:/o:linux:linux_kernel:3
    45.33.49.119 : cpe:/o:linux:linux_kernel:3.3
    45.33.49.119 : cpe:/o:linux:linux_kernel:2.6
    45.33.49.119 : cpe:/h:infomir:mag-250
    45.33.49.119 : cpe:/o:ubnt:airos:5.2.6

    Если нужен только первый- то вместо цикла:
    print(f'{address} : {cpe[0].text}')
    45.33.49.119 : cpe:/h:hp:p2000_g3
    Ответ написан
    2 комментария
  • Как вывести нужные данные с XML файла Python скриптом?

    @PavelMos
    xpath ругается что файл некорректный, нужно вручную некоторые теги править. Если он таким образом всё время создаётся, хотя это странно, то проще использовать для разбора не xpath, а какой-то другой парсер вроде Beautiful Soup или регулярные выражения
    для адреса:
    addr=\"(([0-9]{1,3}[\\.]){3}[0-9]{1,3})\" #результат в группе 1, т.е. второй по счёту, т.к. первым элементом будет результат найденного по всему выражению, а не по его подгруппам
    a=re.search( addr_reg, text)[1]
    https://regex101.com/r/VylVkU/2
    для cpe
    osmatch\sname=\"(.?HP.+?)\".*\n.*(.+?)< #результат будет в группе 2, то есть третьей по счёту
    https://regex101.com/r/VylVkU/1

    import re
    f=open("....")
    text=f.read()
    addr='addr=\\"(([0-9]{1,3}[\\.]){3}[0-9]{1,3})"'
    a=re.search(addr, text)[1] #re.search выдает набор: весь  результат и подргуппы, нужна конкретная подгруппа, в которой адрес, аналогично со вторым re.search
    cpe="osmatch\sname=\"(.?HP.+?)\".*\n.*<cpe>(.+?)<"
    c=re.search(cpe, text)[2]
    print (a,c)
    45.33.49.119 cpe:/h:hp:p2000_g3
    Ответ написан
    2 комментария