Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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_Python 3.x_Beautifulsoup - Fatal编程技术网

Python 提取XML属性

Python 提取XML属性,python,xml,python-3.x,beautifulsoup,Python,Xml,Python 3.x,Beautifulsoup,我有一个XML文件,其中包含数千条记录,格式如下: <custs> <record cust_ID="B123456@Y1996" l_name="Jungle" f_name="George" m_name="OfThe" city="Fairbanks" zip="00010" current="1" /> <record cust_ID="Q975697@Z2000" l_name="Freely" f_name="I" m_name="P"

我有一个XML文件,其中包含数千条记录,格式如下:

<custs>
    <record cust_ID="B123456@Y1996" l_name="Jungle" f_name="George" m_name="OfThe" city="Fairbanks" zip="00010" current="1" />
    <record cust_ID="Q975697@Z2000" l_name="Freely" f_name="I" m_name="P" city="Yellow River" zip="03010" current="1" />
    <record cust_ID="M7803@J2323" l_name="Jungle" f_name="Jim" m_name="" city="Fallen Arches" zip="07008" current="0" />
</custs>
    #   (I know it's not normalized.  This is just sample data)

下一步(最后一步)是什么?

< P>如果这些数据被正确地格式化了,就像使用标准XML一样,你应该考虑而不是BeautifulSoup。使用
lxml
,读取文件,然后可以对其应用DOM逻辑,包括XPath查询。通过XPath查询,您可以获得表示感兴趣的每个节点的
lxml
对象,从中提取所需的数据,并使用类似模块的内容将其重写为您选择的任意格式

具体来说,在lxml文档中,查看以下教程:


如果这些数据被正确地格式化,就像使用标准XML一样,你应该考虑而不是BeautifulSoup。使用

lxml
,读取文件,然后可以对其应用DOM逻辑,包括XPath查询。通过XPath查询,您可以获得表示感兴趣的每个节点的
lxml
对象,从中提取所需的数据,并使用类似模块的内容将其重写为您选择的任意格式

具体来说,在lxml文档中,查看以下教程:

我(也)不会为此使用BeautifulSoup,尽管我喜欢lxml,但这是一个额外的安装,如果您不想麻烦的话,使用标准的lib ElementTree模块就足够简单了

比如:

import xml.etree.ElementTree as ET
import sys
tree=ET.parse( 'test.xml' )
root=tree.getroot()
rs=root.getchildren()
keys = rs[0].attrib.keys()
for a in keys: sys.stdout.write(a); sys.stdout.write('\t')
sys.stdout.write('\n')
for r in rs:
    assert keys == r.attrib.keys()
    for k in keys: sys.stdout.write( r.attrib[k]); sys.stdout.write('\t')
    sys.stdout.write('\n')
将从python-3生成:

zip m_name  current city    cust_ID l_name  f_name  
00010   OfThe   1   Fairbanks   B123456@Y1996   Jungle  George  
03010   P   1   Yellow River    Q975697@Z2000   Freely  I   
07008       0   Fallen Arches   M7803@J2323 Jungle  Jim 
请注意,对于Python-2.7,属性的顺序将有所不同。 如果希望它们以不同的特定顺序输出,则应排序或 按“键”顺序排列列表

断言正在检查所有行是否具有相同的属性。 如果元素中确实缺少或有不同的属性, 然后,您将不得不删除它并添加一些代码来处理这些差异 并为缺少的值提供默认值。(在示例数据中,您有一个 空值(m_name=“”),而不是缺少的值。您可能需要检查 此输出的使用者是否可以处理此情况,或者添加一些 对于这种情况有更多的特殊处理。

我(也)不会为此使用BeautifulSoup,虽然我喜欢lxml,但这是一个额外的安装,如果您不想麻烦的话,使用标准的lib ElementTree模块就足够简单了

比如:

import xml.etree.ElementTree as ET
import sys
tree=ET.parse( 'test.xml' )
root=tree.getroot()
rs=root.getchildren()
keys = rs[0].attrib.keys()
for a in keys: sys.stdout.write(a); sys.stdout.write('\t')
sys.stdout.write('\n')
for r in rs:
    assert keys == r.attrib.keys()
    for k in keys: sys.stdout.write( r.attrib[k]); sys.stdout.write('\t')
    sys.stdout.write('\n')
将从python-3生成:

zip m_name  current city    cust_ID l_name  f_name  
00010   OfThe   1   Fairbanks   B123456@Y1996   Jungle  George  
03010   P   1   Yellow River    Q975697@Z2000   Freely  I   
07008       0   Fallen Arches   M7803@J2323 Jungle  Jim 
请注意,对于Python-2.7,属性的顺序将有所不同。 如果希望它们以不同的特定顺序输出,则应排序或 按“键”顺序排列列表

断言正在检查所有行是否具有相同的属性。 如果元素中确实缺少或有不同的属性, 然后,您将不得不删除它并添加一些代码来处理这些差异 并为缺少的值提供默认值。(在示例数据中,您有一个 空值(m_name=“”),而不是缺少的值。您可能需要检查 此输出的使用者是否可以处理此情况,或者添加一些
对于这种情况有更特殊的处理。

是您在写入文件、在写入文件时格式化数据,还是从结果中获取相关数据时遇到的问题?我认为问题在于分离属性,以便将它们写入输出文件。我已经编辑了代码块以添加输出文件。我应该在一开始就这样做。Tha谢谢你的提醒!你在写入文件、在写入文件时格式化数据或从结果中获取相关数据时有问题吗?我认为问题在于分离属性,以便我可以将它们写入输出文件。我已经编辑了代码块以添加输出文件。我应该在开始时就这样做。谢谢你的menti谢谢!考虑到您所掌握的信息,这很好。我从来没有想到我不是在根级别工作,而是在两级,有时是三级。而且,我对输入文件没有任何控制权,它非常脏。我认为lxml或BeautifulSoup都可以更好地处理这些肮脏的输入。我确信如果我我知道你的方法可以很容易地处理不同的级别。谢谢!考虑到你所掌握的信息,这很有效。我从来没有想到我不是在根级别工作,而是在两个级别,有时是三个级别。此外,我对输入文件没有任何控制权,它非常脏。我认为lxml或BEUtifulSoup可以更好地处理肮脏的输入。我相信,如果我知道的更多,那么您的方法将同样轻松地处理各种级别。