¿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}")
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 etiquetawb:incomeLevel
tiene un atributoiso2code="XD"
, por lo que es necesario utilizar un diccionario para especificarlo en el métodofind
.Aquí está el código actualizado:
Esto debería mostrar el nombre, iso2Code y nivel de ingresos de cada país en el enlace xml.