Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的Chatango xml解析_Python_Xml - Fatal编程技术网

python中的Chatango xml解析

python中的Chatango xml解析,python,xml,Python,Xml,我一直在努力寻找用python解析xml的最佳和最干净的方法。在chatango上有一个xml站点,其中包含用户的个人资料信息,如出生日期(b标记)、性别(s标记)、他们的mini(body标记和引号)和位置(l标记)。我想做的是获取这些标记的文本,但问题是如果用户没有在他们的配置文件中填写某些内容,那么标记和文本将不会出现在xml站点上。所以我试着检查这个标签是否在网站上,并获取文本,如果不是,我会把它改成一个问号。所以问题是我需要帮助找到一种更干净的方法。我一直在查找类似的问题,但没有发现任

我一直在努力寻找用python解析xml的最佳和最干净的方法。在chatango上有一个xml站点,其中包含用户的个人资料信息,如出生日期(b标记)、性别(s标记)、他们的mini(body标记和引号)和位置(l标记)。我想做的是获取这些标记的文本,但问题是如果用户没有在他们的配置文件中填写某些内容,那么标记和文本将不会出现在xml站点上。所以我试着检查这个标签是否在网站上,并获取文本,如果不是,我会把它改成一个问号。所以问题是我需要帮助找到一种更干净的方法。我一直在查找类似的问题,但没有发现任何问题,希望你们能提供帮助P

以下是一些xml站点:

这个有所有的标签:

还有一个只有一些的例子:

我想出了一个代码:

import urllib.request
import urllib.parse
import datetime
from xml.etree import cElementTree as ET

class prof:

    def getProf(name):
        if len(name) == 1: url = "http://ust.chatango.com/profileimg/"+name+"/"+name+"/"+name+"/mod1.xml"
        elif len(name) > 1: url = "http://ust.chatango.com/profileimg/"+name[0]+"/"+name[1]+"/"+name+"/mod1.xml"
        f = urllib.request.urlopen(url)
        data = f.read().decode("utf-8")
        data = ET.parse(data).getroot()
        today = datetime.date.today()
        if data.find("s") is not None:
            gender = data.find("s").text
        else:
            gender = "?"
        if data.find("b") is not None:
            age = data.find("b").text.split("-")
            age = today.year - age[0] - ((today.month, today.day) < (age[1], age[2]))
        else:
            age = "?"
        if data.find("l") is not None:
            location = data.find("l").text
        else:
            location = "?"
        if data.find("body") is not None:
            mini = urllib.parse.unquote(data.find("body").text)
        else:
            mini = "?"
        if len(mini) < 1575:
            return "%s Info - Gender: %s, Age: %s, Location: %s <br/> %s" % (name, gender, age, location, mini)
       else:
            return "%s Info - Gender: %s, Age: %s, Location: %s <br/> Too many characters to display!" % (name, gender, age, location)
导入urllib.request
导入urllib.parse
导入日期时间
从xml.etree导入cElementTree作为ET
班主任:
def getProf(名称):
如果len(name)==1:url=”http://ust.chatango.com/profileimg/“+name+”/“+name+”/“+name+”/mod1.xml”
elif len(名称)>1:url=”http://ust.chatango.com/profileimg/“+name[0]+”/“+name[1]+”/“+name+”/mod1.xml”
f=urllib.request.urlopen(url)
数据=f.读取().解码(“utf-8”)
data=ET.parse(data).getroot()
今天=datetime.date.today()
如果data.find(“s”)不是无:
性别=数据。查找(“s”)。文本
其他:
性别=“?”
如果data.find(“b”)不是无:
年龄=数据。查找(“b”)。文本。拆分(“-”)
age=today.year-age[0]-((today.month,today.day)<(age[1],age[2]))
其他:
年龄=“?”
如果data.find(“l”)不是无:
位置=数据。查找(“l”)。文本
其他:
位置=“?”
如果data.find(“正文”)不是None:
mini=urllib.parse.unquote(data.find(“body”).text)
其他:
mini=“?”
如果len(mini)<1575:
返回“%s信息-性别:%s,年龄:%s,位置:%s
%s”%(姓名,性别,年龄,位置,迷你) 其他: 返回“%s信息-性别:%s,年龄:%s,位置:%s
字符太多,无法显示!”%(姓名,性别,年龄,位置)
您的解决方案没有什么问题,但是如果您希望它更干净一点:

而不是

if data.find("s") is not None:
    gender = data.find("s").text
else:
    gender = "?"
您可以使用允许您指定默认值的功能:

gender = data.findtext("s", "?")

这适用于性别和位置,但对于年龄和迷你们来说,你已经在做的事情是好的。

这里有一个更新的代码粘贴,与这里的代码匹配。啊,我明白了。通常我担心我的代码看起来如何,所以我会征求其他人的意见。谢谢你帮助我!