Python 从infotable中提取数据,同时填充缺少的值

Python 从infotable中提取数据,同时填充缺少的值,python,beautifulsoup,Python,Beautifulsoup,我有这个.txt文件,它的格式类似于XML,但问题是从它检索到的网站警告我这是一个无效的XML格式。通过一些解析,我使用infoTable作为参考,设法在这些小数据块中获取我的信息 同伴 SHS A级- 00000 21944 3060500 嘘 鞋底 3060500 0 0 第二公司 组件对象模型 00001 67822 1898717 嘘 鞋底 1898717 0 0 公司树 CL B新 00002 10462145 52078974 嘘 鞋底 52078974 0 0 变量数据正在连接

我有这个.txt文件,它的格式类似于XML,但问题是从它检索到的网站警告我这是一个无效的XML格式。通过一些解析,我使用infoTable作为参考,设法在这些小数据块中获取我的信息


同伴
SHS A级-
00000
21944
3060500
嘘
鞋底
3060500
0
0
第二公司
组件对象模型
00001
67822
1898717
嘘
鞋底
1898717
0
0
公司树
CL B新
00002
10462145
52078974
嘘
鞋底
52078974
0
0

变量
数据
正在连接有问题的字符串(-太长,无法粘贴到此处):

写入
数据.csv

NameofIssuer,TitleofClass,cusip,value,shrsPrnamt,shrsPrnamtType,putcall,investmentDescrestion,othermanager,vaSole,vaShared,vaNone
COMPANYFOUR,COM,00004,67,36100,SH,Call,DFND,"01, 02",36100,0,0
COMPANYFIVE,SPONSORED ADS A,00005,2695,339367,SH,NaN,DFND,"01, 02",339367,0,0
COMPANYONE,SHS CLASS -A -,00000,21944,3060500,SH,NaN,SOLE,NaN,3060500,0,0
COMPANYTWO,COM,00001,67822,1898717,SH,NaN,SOLE,NaN,1898717,0,0
COMPANYTHREE,CL B NEW,00002,10462145,52078974,SH,NaN,SOLE,NaN,52078974,0,0
在LibreOffice中,它看起来:


使用
lxml.etree
ordereddict
pandas
库的扩展解决方案:

我们首先需要修复格式错误的XML内容:主要思想是使用XML名称空间(
ns1
)添加
root
标记。出于演示目的,输入xml(取自问题原样)被解析为字符串,并进行进一步修改

from lxml import etree
import pandas as pd
import sys
from collections import OrderedDict

xml_content = '<root xmlns:ns1="http://base.google.com/ns/1.0">{}</root>'\
    .format(open('base.xml').read())
doc = etree.fromstring(xml_content)
ns = {'ns1': 'http://base.google.com/ns/1.0'}
records = []

for block in doc.findall('ns1:infoTable', namespaces=ns):
    d = OrderedDict()
    for el in block.getchildren():
        el_tag = el.tag.replace("{{{}}}".format(ns['ns1']), '')
        inner_childs = el.getchildren()
        if inner_childs:    # if element has child nodes
            prefix = 'va' if el_tag == 'votingAuthority' else ''
            d.update({prefix + child.tag.replace("{{{}}}".format(ns['ns1']), ''): child.text
                      for child in inner_childs})
        else:
            d[el_tag] = el.text
    records.append(d)

df = pd.DataFrame(records)
print(df.to_string(index=False, justify=True))
要使用所需分隔符将结果保存到csv文件中,请使用
df.To\u csv()
例程:

df.to_csv(path_or_buf='output.csv', sep='\t', index=False)

othermanager
putcall
标记在xml中不存在,为什么它们应该出现在结果中?现在我认为这是一个非常糟糕的示例文件,但这只是我正在使用的示例之一。我注意到的其他文件有othermanager和putcall标记,这意味着您需要发布另一个输入xml还是编辑您的预期结果—以关联输入和输出,我刚刚包含了另一个XML示例,以显示缺少的两个标记show large是输入文本文件吗?如果我只是让一个变量打开我要解析的指定.txt文件,这个过程是否也会工作?而不是把所有东西都保存在一个字符串中?@onbu我想是的。尝试加载数据,例如
soup=BeautifulSoup(打开('yourfile.txt','r').read(),'lxml')
nameOfIssuer     titleOfClass  cusip value sshPrnamt sshPrnamtType putCall investmentDiscretion otherManager  vaSole vaShared vaNone
 COMPANYFOUR              COM  00004    67     36100            SH    Call                 DFND       01, 02   36100        0      0
 COMPANYFIVE  SPONSORED ADS A  00005  2695    339367            SH     NaN                 DFND       01, 02  339367        0      0
df.to_csv(path_or_buf='output.csv', sep='\t', index=False)