Cómo obtener una cadena en particular en xml usando python o perl, etc.

desde aquí necesito obtener (nombre de usuario) "pelech" solo. Este es solo un ejemplo en mi archivo XML. Tengo 1000 usuarios. Por favor, ayúdame a resolver este problema.


    pelech
    passwords are saved outside

Intenté seguir el guión pero no 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')));
~
3

5 Respuestas

Si está en el sistema operativo Linux: simple xmlstarlet solución:

xmlstarlet sel -t -v "//user/login" -n users.xml
6
agregado

Solo puedo asumir que tu xml está formateado de manera similar a


    
    pelech 1
    passwords are saved outside


    pelech 2
    passwords are saved outside

Primero debe encontrar su etiqueta de inicio de sesión, luego debe estar agarrando el texto de esa etiqueta a medida que se itera dentro de su bucle.

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 este xml como ejemplo, esto funciona bien para mí.

4
agregado
docs.python.org/3/library/xml.etree .elementtree.html # example ¿las expresiones xpath hacen esto más conciso?
agregado el autor Uygar Y, fuente

Yo uso beautifulsoup para lograr esto

Si instala utilizando pip, siga las siguientes instrucciones

pip install bs4

Puedes probarlo en el shell interactivo de Python

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

Yo uso el html.parser predeterminado. Si tiene dificultades para analizarlo correctamente, puede considerar usar lxml en su lugar.

For completeness sake, you can just iterate through the list returned from soup.find_all("login")

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

Alternativamente, el camino pitónico.

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

For more details refer to https://www.crummy.com/software/BeautifulSoup/bs4/doc/

3
agregado

Si se garantiza que su archivo está en este formato con el nombre de inicio de sesión dentro de las etiquetas en una línea separada, no necesita bibliotecas xml y puede hacer una

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

Esto elimina las etiquetas y los espacios iniciales de esa línea e imprime los restos (¡el nombre de usuario!), Mientras que todas las demás líneas se suprimen con la opción -n .

1
agregado

usar el módulo lxml


    pelech
    passwords are saved outside

El siguiente código extraerá pelech del xml.

from lxml import etree

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

learn more about xpath and lxml

0
agregado