【问题标题】:具有多个标签的 XML
【发布时间】:2022-01-22 23:18:00
【问题描述】:

问题是通过在 <Envelope> 之后开始的 xml 进行解析

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 格式提取数据。数据来自计数。确切地说,它被称为股票摘要。我不知道如何进行。数据也带有空值。这需要照原样捕捉。

edit* :我有意放置 xml 的一部分,其中包含需要提取的所有数据(图像的第 13 行是预期的输出)。输出需要具有所有这些值,具有最低级别的粒度(1 行中的每件事)请查看此图像以供参考:

【问题讨论】:

  • 根据您发布的 xml - 预期的输出是什么?
  • 好吧,尽管它说的是 UTF-8,但是,有时会有 BOM 导致 python 给出空的“汤”

标签: python xml csv beautifulsoup


【解决方案1】:

我总结了我对使用 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\n%15s\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  

【讨论】:

  • 你是一个纯粹的天才!它就像一个魅力!离我想要的有点远,所以我正在努力,但是,是的,它工作得很好!
  • 另外,我对学习它非常感兴趣(SAX-parser)。我最近开始学习编码。我仍在学习对象和类。请建议任何链接将帮助我做得更好。谢谢。
  • 我已经在 CSV 文件中添加了我想要的值的输出图像,它也会有一些标题。我通常会为每一列创建多个列表,用一个作为标题的字符串对其进行初始化,然后继续在其中附加值。然后将所有内容压缩在一起并将其提取到 csv 文件中。我确实通过制作字典来尝试过,但是,它不包括空格。所以,我开始使用列表,因为我发现它更灵活。但是,我知道使用字典会更加高效和 Pythonic。
  • 嗨@AlokPandey,我会向您推荐以下资源,它们对我非常有用:python-kurs.eu/python_XML_SAX.php 和 Alex Martelli 的食谱/第 12 章(我有一本,它考虑了 Python 2,但应该没问题),当然 python 文档docs.python.org/3/library/xml.sax.html#module-xml.sax 也是一个很好的起点:)
  • 不幸的是,第一个链接只有德语,但是代码块的结构非常好,并且提供了对 sax-parser 机制的大量理解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2016-06-09
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多