Самый простой способ сортировки XML в Python? [Skype Bot]
Я делаю бота для Skype, и одна из моих команд это! Trace ip_or_website_here
Тем не менее, я вижу проблемы с сортировкой моих XML-ответов.
Commands.py:
elif msg.startswith('!trace '):
debug.action('!trace command executed.')
send(self.nick + 'Tracing IP. Please Wait...')
ip = msg.replace('!trace ', '', 1);
ipinfo = functions.traceIP(ip)
send('IP Information:\n'+ipinfo)
И мои функции.
def traceIP(ip):
return urllib2.urlopen('http://freegeoip.net/xml/'+ip).read()
Теперь моя проблема в том, что ответы выглядят так:
!trace skype.com
Bot: Tracing IP. Please Wait...
IP Information:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Ip>91.190.216.21</Ip>
<CountryCode>LU</CountryCode>
<CountryName>Luxembourg</CountryName>
<RegionCode></RegionCode>
<RegionName></RegionName>
<City></City>
<ZipCode></ZipCode>
<Latitude>49.75</Latitude>
<Longitude>6.1667</Longitude>
<MetroCode></MetroCode>
<AreaCode></AreaCode>
Теперь я хочу, чтобы у меня была возможность работать без тегов XML.
Больше похоже на это:
IP-адрес: IP
Код страны: CountryCodeHere
Название страны: название страны здесь
и так далее.
Любая помощь будет оценена.
Заранее спасибо.
1 ответ
Решение
BeautifulSoup хорош для анализа XML.
>>> from bs4 import BeautifulSoup
>>> xml = urllib2.urlopen('http://freegeoip.net/xml/192.168.1.1').read()
>>> soup = BeautifulSoup(xml)
>>> soup.ip.text
u'192.168.1.1'
Или более подробно..
#!/usr/bin/env python
import urllib2
from bs4 import BeautifulSoup
ip = "192.168.1.1"
xml = urllib2.urlopen('http://freegeoip.net/xml/' + ip).read()
soup = BeautifulSoup(xml)
print "IP Address: %s" % soup.ip.text
print "Country Code: %s" % soup.countrycode.text
print "Country Name: %s" % soup.countryname.text
Выход:
IP Address: 192.168.1.1
Country Code: RD
Country Name: Reserved
(обновлено до последнего BeautifulSoup
версия)