問題是通過 xml 決議后立即開始 <Envelope>
from bs4 import BeautifulSoup
Filename =input("Enter File name to be imported :" )
imp_ext = ".xml"
imp_file = ("".join([Filename,imp_ext]))
#it is in UTF-16BE format
with open(imp_file, encoding= 'UTF-16') as fp:
soup = BeautifulSoup(fp, 'xml')
湯有這樣的資料:
<?xml version="1.0" encoding="UTF-8"?>
<ENVELOPE>
<DSPACCNAME>
<DSPDISPNAME>206375</DSPDISPNAME>
</DSPACCNAME>
<DSPSTKINFO>
<DSPSTKOUT>
<DSPOUTQTY>1 EA</DSPOUTQTY>
<DSPOUTRATE>715.00</DSPOUTRATE>
<DSPNETTCRAMTA>715.00</DSPNETTCRAMTA>
<DSPCRAMTA>715.00</DSPCRAMTA>
<DSPCONSAMT>-358.62</DSPCONSAMT>
<DSPGPAMT>356.38</DSPGPAMT>
<DSPGPPERC>49.84 %</DSPGPPERC>
</DSPSTKOUT>
<DSPSTKCL>
<DSPCLQTY>3 EA</DSPCLQTY>
<DSPCLRATE>358.62</DSPCLRATE>
<DSPCLAMTA>-1075.87</DSPCLAMTA>
</DSPSTKCL>
</DSPSTKINFO>
<SSBATCHNAME>
<SSBATCH />
<SSGODOWN>Ware -House (Mankoli-Bhiwandi)</SSGODOWN>
</SSBATCHNAME>
<DSPSTKINFO>
<DSPSTKOUT>
<DSPOUTQTY>1 EA</DSPOUTQTY>
<DSPOUTRATE>715.00</DSPOUTRATE>
<DSPNETTCRAMTA>715.00</DSPNETTCRAMTA>
<DSPCRAMTA>715.00</DSPCRAMTA>
<DSPCONSAMT>-358.62</DSPCONSAMT>
<DSPGPAMT>356.38</DSPGPAMT>
<DSPGPPERC>49.84 %</DSPGPPERC>
</DSPSTKOUT>
<DSPSTKCL>
<DSPCLQTY>3 EA</DSPCLQTY>
<DSPCLRATE>358.62</DSPCLRATE>
<DSPCLAMTA>-1075.87</DSPCLAMTA>
</DSPSTKCL>
</DSPSTKINFO>
</ENVELOPE>
然后我試圖從我也嘗試過的 xml 檔案中提取資料:
for a in soup.findAll('DSPACCNAME'):
for b in soup.findAll('DSPSTKINFO'):
print(a.DSPDISPNAME)
print(b.DSPCLQTY)
print(b.DSPCLRATE)
print(b.DSPCLAMTA)
我得到的輸出是這樣的:
206375
1 EA
715.00
715.00
715.00
-358.62
356.38
49.84%
問題是我沒有創建邊界的父類。我正在嘗試以 CSV 格式提取資料。資料來自理貨。確切地說,它被稱為股票摘要。我不知道如何繼續。資料也帶有空值。這需要按原樣捕獲。
編輯*:我有意將一部分 xml 包含需要提取的所有資料(影像的第 13 行是預期輸出)。輸出必須是具有所有這些值的東西,具有最低級別的粒度(1 行中的每件事),請查看此影像以供參考:

uj5u.com熱心網友回復:
我總結了我對使用 SAX 決議器的解決方案的建議,它非常高效,但它的結構需要一些努力來調整所需的結果。
#https://stackoverflow.com/questions/70437073/xml-with-multiple-tags
from collections import OrderedDict
from xml.sax.handler import ContentHandler
import xml.sax
import sys
class CustomHandler(ContentHandler):
def __init__( self ):
tmp = ["DSPACCNAME", "DSPSTKOUT", "DSPSTKCL"] # extensible with further tags
self.tags = OrderedDict()
for t in tmp:
self.tags.setdefault(t, False)
def startElement(self, name, attrs):
if name in self.tags.keys():
self.tags[name] = True
sys.stdout.write("\n%s\ns\n" % (name.strip(), "="*15))
def characters(self, content):
for v in self.tags.values():
if v:
sys.stdout.write("%3s" % content.strip())
def endElement(self, name):
if name in self.tags.keys():
self.tags[name] = False
parser = xml.sax.make_parser()
handler = CustomHandler()
parser.setContentHandler(handler)
parser.parse("test.xml")
RESULTS:
DSPACCNAME
===============
206375
DSPSTKOUT
===============
1 EA 715.00 715.00 715.00 -358.62 356.38 49.84 %
DSPSTKCL
===============
3 EA 358.62 -1075.87
DSPSTKOUT
===============
1 EA 715.00 715.00 715.00 -358.62 356.38 49.84 %
DSPSTKCL
===============
3 EA 358.62 -1075.87
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389420.html
上一篇:如何為這個xml創建一個xslt&輸出是帶有culomn{numInscription,nom,prenom,nomModule}&條件etudiant.id_promo=module.id_prom
