Python 提取XML属性
我有一个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"
<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文档中,查看以下教程:
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可以更好地处理肮脏的输入。我相信,如果我知道的更多,那么您的方法将同样轻松地处理各种级别。