我有一个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)
如何将其转换为CSV或制表符分隔文件?我知道我可以使用re.compile()语句在Python中对其进行硬编码,但是在diff XML文件布局中必须有更简单,更便携的东西。
我在这里发现了一些关于attribs的帖子,(Beautifulsoup unable to extract data using attrs=class,Extracting an attribute value with beautifulsoup)他们几乎让我在那里:
# Python 3.30
#
from bs4 import BeautifulSoup
import fileinput
Input = open("C:/Python/XML Tut/MinGrp.xml", encoding = "utf-8", errors = "backslashreplace")
OutFile = open('C:/Python/XML Tut/MinGrp_Out.ttxt', 'w', encoding = "utf-8", errors = "backslashreplace")
soup = BeautifulSoup(Input, features="xml")
results = soup.findAll('custs', attrs={})
# output = results [0]#[0]
for each_tag in results:
cust_attrb_value = results[0]
# print (cust_attrb_value)
OutFile.write(cust_attrb_value)
OutFile.close()
下一步(最后?)步骤是什么?
答案 0 :(得分:2)
如果此数据格式正确 - 例如,使用规范XML - 您应该考虑lxml
而不是BeautifulSoup。使用lxml
,您可以读取文件,然后可以在其上应用DOM逻辑,包括XPath查询。使用XPath查询,您可以获得代表您感兴趣的每个节点的lxml
个对象,从中提取您需要的数据,并使用类似的方式将它们重写为您选择的任意格式。 csv
模块..
具体来说,在lxml文档中,请查看以下教程:
答案 1 :(得分:1)
我(也)不会使用BeautifulSoup,虽然我喜欢lxml,但这是一个额外的安装,如果你不想打扰,这很简单,可以使用标准的lib ElementTree模块。< / p>
类似的东西:
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 =“”),而不是缺失值。你可能想检查一下 这种情况由此输出的消费者处理好,或者添加一些 对这种情况更特殊的处理。