es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo analizar XML con espacios de nombres en etiquetas usando BeautifulSoup?

Tengo un enlace XML (http://api.worldbank.org/v2/countries) con los siguientes datos:

<!-- language: lang-xml -->
<wb:countries xmlns:wb="http://www.worldbank.org" page="1" pages="6" per_page="50" total="299">
    <wb:country id="ABW">
        <wb:iso2code>AW</wb:iso2code>
        <wb:name>Aruba</wb:name>
        <wb:region id="LCN" iso2code="ZJ">América Latina y el Caribe </wb:region>
        <wb:adminregion id="" iso2code=""></wb:adminregion>
        <wb:incomelevel id="HIC" iso2code="XD">Ingreso alto</wb:incomelevel>
        <wb:lendingtype id="LNX" iso2code="XX">No clasificado</wb:lendingtype>
        <wb:capitalcity>Oranjestad</wb:capitalcity>
        <wb:longitude>-70.0167</wb:longitude>
        <wb:latitude>12.5167</wb:latitude>
    </wb:country>
    <wb:country id="AFE">
        <wb:iso2code>ZH</wb:iso2code>
        <wb:name>África Oriental y Meridional</wb:name>
        <wb:region id="NA" iso2code="NA">Agregados</wb:region>
        <wb:adminregion id="" iso2code=""></wb:adminregion>
        <wb:incomelevel id="NA" iso2code="NA">Agregados</wb:incomelevel>
        <wb:lendingtype id="" iso2code="">Agregados</wb:lendingtype>
        <wb:capitalcity></wb:capitalcity>
        <wb:longitude></wb:longitude>
        <wb:latitude></wb:latitude>
    </wb:country>
</wb:countries>

Intenté analizar el nivel de ingresos pero devuelve (None), ¿cómo puedo acceder al texto (por ejemplo, Ingreso alto) en el texto XML usando BeautifulSoup? Intenté este código, ¡pero no funciona como debería!

<!-- language: lang-py -->
import requests
from bs4 import BeautifulSoup

url = 'http://api.worldbank.org/v2/countries'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'lxml')
countries = soup.findAll('wb:country')

for country in countries:
    name = country.find("wb:name").text
    code = country.find('wb:iso2Code').text
    incomeLevel = country.find('wb:incomeLevel', {"iso2code":"XD"})
    print(f"{name}, {code}, {incomeLevel}")
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para acceder al texto en el texto xml utilizando BeautifulSoup, se puede utilizar el método .text. Sin embargo, en este caso, la etiqueta wb:incomeLevel tiene un atributo iso2code="XD", por lo que es necesario utilizar un diccionario para especificarlo en el método find.

    Aquí está el código actualizado:

    import requests
    from bs4 import BeautifulSoup
    
    url = 'http://api.worldbank.org/v2/countries'
    
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'xml')
    countries = soup.findAll('wb:country')
    
    for country in countries:
        name = country.find("wb:name").text
        code = country.find('wb:iso2Code').text
        incomeLevel = country.find('wb:incomeLevel', {'iso2code':'XD'}).text
        print(f"{name}, {code}, {incomeLevel}")
    

    Esto debería mostrar el nombre, iso2Code y nivel de ingresos de cada país en el enlace xml.

Comments are closed.