Como obter uma string específica em xml usando python ou perl etc

3

daqui eu preciso obter (nome de usuário) "pelech" sozinho este é apenas um exemplo no meu arquivo xml eu tenho 1000 usuários.

<user>
    <login>pelech</login>
    <password>passwords are saved outside</password>
</user>

Eu tentei seguir o script, mas não funciona.

import xml.etree.ElementTree as ET

tree = ET.parse("users.xml")
root = tree.getroot()
for app in root.findall('user'):
    for l in zip(app.iter('login')):
        print("%s" % (app.get('login')));
~
    
por Ravi 04.08.2017 / 08:33

5 respostas

6

Se você está no sistema operacional Linux - simples xmlstarlet :

xmlstarlet sel -t -v "//user/login" -n users.xml
    
por 04.08.2017 / 09:02
4

Só posso supor que seu XML esteja formatado de maneira semelhante a

<users>
    <user>
    <login>pelech 1</login>
    <password>passwords are saved outside</password>
</user>
<user>
    <login>pelech 2</login>
    <password>passwords are saved outside</password>
</user>

Você precisa encontrar sua tag de login primeiro e, em seguida, precisa pegar o texto dessa tag enquanto itera dentro do loop.

import xml.etree.ElementTree as ET

tree = ET.parse("users.xml")
root = tree.getroot()
for app in root.findall('user'):
    for l in app.findall('login'):
       print("%s" % (l.text));

Usando esse XML como exemplo, isso funciona bem para mim.

    
por 04.08.2017 / 09:08
3

Eu uso o beautifulsoup para conseguir isso

Se você instalar usando pip, siga as seguintes instruções

pip install bs4

Você pode testá-lo no shell interativo do Python

>>> from bs4 import BeautifulSoup as Soup
>>> content = """<user>
...     <login>pelech</login>
...     <password>passwords are saved outside</password>
... </user>"""
>>> soup = Soup(content, "html.parser")
>>> soup.find_all("login")
[<login>pelech</login>]
>>> soup.find("login").text
'pelech'

Eu uso o padrão html.parser. Se você tiver dificuldades em analisá-lo corretamente, considere o uso de lxml.

Por razões de integralidade, você pode apenas percorrer a lista retornada de soup.find_all("login")

>>> for login in soup.find_all("login"):
...   print(login.text)
... 
pelech

Alternativamente, a maneira pythonic

>>> usernames = [login.text for login in soup.find_all("login")]
>>> usernames
['pelech']

Para mais detalhes, consulte o link

    
por 04.08.2017 / 08:50
1

Se o seu arquivo tiver a garantia de estar nesse formato com o nome de login dentro das tags em uma linha separada, você não precisa de bibliotecas xml e pode fazer uma simples

sed -n 's_ *</*login>__gp' your.xml

Isso remove as tags e espaços iniciais dessa linha e imprime os restos (o nome do usuário!), enquanto todas as outras linhas são suprimidas pela opção -n .

    
por 04.08.2017 / 09:37
0

use o módulo lxml

<user>
    <login>pelech</login>
    <password>passwords are saved outside</password>
</user>

O código a seguir extrairá o pelech do xml

from lxml import etree

document = etree.parse(open("users.xml"))
user = etree.xpath("//login")[0].text    #user will have value pelech

saiba mais sobre xpath e lxml

    
por 04.08.2017 / 13:27