Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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 如何正确地从这个xml中提取信息_Python_Xml_Elementtree - Fatal编程技术网

Python 如何正确地从这个xml中提取信息

Python 如何正确地从这个xml中提取信息,python,xml,elementtree,Python,Xml,Elementtree,我试图查询一个xml文档,以打印出与低级元素关联的高级元素属性。我得到的结果与xml结构不一致。基本上这就是我到目前为止的代码 import xml.etree.ElementTree as ET tree = ET.parse('movies2.xml') root = tree.getroot() for child in root: print(child.tag, child.attrib) print() mov = root.findall("./genre/decad

我试图查询一个xml文档,以打印出与低级元素关联的高级元素属性。我得到的结果与xml结构不一致。基本上这就是我到目前为止的代码

import xml.etree.ElementTree as ET

tree = ET.parse('movies2.xml') root = tree.getroot()

for child in root:
    print(child.tag, child.attrib) print()

mov = root.findall("./genre/decade/movie/[year='2000']")
for movie in mov:
    print(child.attrib['category'], movie.attrib['title'])
这就产生了-

genre {'category': 'Action'}
genre {'category': 'Thriller'}
genre {'category': 'Comedy'}

Comedy X-Men
Comedy American Psycho
如果检查xml,最后两行应该列出与电影标题相关的两个不同类型属性-

Action X-Men
Thriller American Psycho
这是供参考的xml-


数字化视频光盘
1981
PG
考古学家兼冒险家印第安纳·琼斯
是被美国政府雇佣来寻找约柜的
纳粹面前的盟约。”
DVD,在线
1984
PG
没有提供。
蓝光
1985
PG
马蒂·麦克弗利
数字dvd
2000
PG-13
两名变种人来到一所私立学院,他们的超级英雄团队必须
反对具有类似权力的恐怖组织。
VHS
1992
第13页
不。
在线 的
1992
R
我想要什么都行!!!?!
数字化视频光盘
1979
R
"""""""""
数字化视频光盘
1986
第13页
关于一个滑稽家伙的滑稽电影
蓝光
2000
未评级
精神变态贝特曼
DVD,VHS
1966
PG
真是个笑话!
数字化视频光盘
2010
第13页
艾玛·斯通=海丝特·白兰
DVD、数字、Netflix
2011
未评级
蒂姆(陆克文)是一位正在崛起的高管
“成功”找到完美的客人,国税局员工
巴里(卡雷尔),为他老板的每月活动,一个所谓的
“为白痴准备的晚餐”,这对
和最大的小丑一起出现的高管。
在线,VHS
1984
PG
你要给谁打电话?
蓝光
1991
不为人知
罗宾汉杀人案
您的初始循环:

for child in root:
    print(child.tag, child.attrib) print()
child
设置为最后一个孩子;因此
child.attrib['category']
将始终是最后一个孩子的类别。在您的情况下,最后一个孩子是喜剧。对于第二个循环中的每一部电影:

for movie in mov:
   print(child.attrib['category'], movie.attrib['title'])
您正在打印第一个循环中找到的最后一个孩子的类别;因此他们都打印“喜剧”

编辑:这将至少选择具有正确类型标签的相同电影,但可能具有不同的顺序:

for child in root:
    mov = child.findall("./decade/movie/[year='2000']")
    for movie in mov:
        print(child.attrib['category'], movie.attrib['title'])
另一种方法,使用而不是ElementTree:

from lxml import etree as ET

tree = ET.parse('movies2.xml')
root = tree.getroot()

mov = root.findall("./genre/decade/movie/[year='2000']")
for movie in mov:
    print(movie.getparent().getparent().attrib['category'], movie.attrib['title'])

谢谢,这很有意义。我如何构建一个将流派属性与电影标题连接起来的“线程”呢?我在查询中肯定遗漏了一些东西。我认为elementtree无法回溯到父母或祖父母,因此这种方法会有一些问题。你可以用稍微不同的方法来处理,首先迭代所有的元素nres,然后将你的findall基于这些类型。但是它们可能会以不同的顺序出现,按类型分组。我会用建议编辑答案。另外,我刚刚检查了,和lxml()确实有回访功能,但lxml不是内置的,您需要安装它。我通常使用lxml,因为我使用XSLT,lxml支持XSLT,但elementtree不支持。我将添加另一个使用lxml的示例。感谢提示!看起来不错。目前正在旅行,所以我回来后必须尝试。lxml方法看起来很有趣更直观——我已经安装好了,我们拭目以待。
from lxml import etree as ET

tree = ET.parse('movies2.xml')
root = tree.getroot()

mov = root.findall("./genre/decade/movie/[year='2000']")
for movie in mov:
    print(movie.getparent().getparent().attrib['category'], movie.attrib['title'])