【问题标题】:How do i parse a xml comment properly in python如何在 python 中正确解析 xml 注释
【发布时间】:2016-05-02 13:58:50
【问题描述】:

我最近一直在使用 Python,我想从给定的 xml 文件中提取信息。问题是信息存储得非常糟糕,采用这样的格式

<Content>
   <tags>
   ....
   </tags>
<![CDATA["string1"; "string2"; ....
]]>
</Content>

我不能在这里发布全部数据,因为它大约有 20.000 行。 我只想收到包含 ["string1", "string2", ...] 的列表,这是我迄今为止一直在使用的代码:

import xml.etree.ElementTree as ET

tree = ET.parse(xmlfile)
for node in tree.iter('Content'):
    print (node.text)

但是我的输出没有。我怎样才能收到评论数据? (同样,我使用的是 Python)

【问题讨论】:

  • 如果您只想要一行,请考虑打开文件并尝试使用字符串/正则表达式函数查找该行。
  • 这不是一行,就像我说的我有大约 20000 行作为列表元素。
  • 不过,请考虑使用文件打开和通读策略,因为对于一个巨大的 XML 文档,DOM 创建/解析/遍历可能很耗时。

标签: python xml parsing comments


【解决方案1】:

您需要创建基于 SAX 的解析器,而不是基于 DOM 的解析器。尤其是像您这样大的文档。

基于 sax 的解析器要求您编写自己的控制逻辑来存储数据。它比简单地将其加载到 DOM 中要复杂得多,但要快得多,因为它是逐行加载而不是一次加载整个文档。这给了它一个优势,它可以用 cmets 处理像你这样的松鼠案例。

在构建处理程序时,您可能希望在解析器中使用 LexicalHandler 来提取这些 cmets。

我会给你一个关于如何构建一个工作的例子,但是我已经很长时间没有自己做了。有很多关于如何在线构建基于 sax 的解析器的指南,并将讨论推迟到另一个线程。

【讨论】:

    【解决方案2】:

    问题是您的评论似乎不标准。标准评论是&lt;!--Comment here--&gt; 这样的。

    这些类型的 cmets 可以用 Beautifulsoup 解析,例如:

    from bs4 import BeautifulSoup, Comment
    
    xml = """<Content>
       <tags>
       ...
       </tags>
    <!--[CDATA["string1"; "string2"; ....]]-->
    </Content>"""
    soup = BeautifulSoup(xml)
    comments = soup.findAll(text=lambda text:isinstance(text, Comment))
    print(comments)
    

    这将返回 ['[CDATA["string1"; "string2"; ....]]'] 从那里可以很容易地进一步解析为所需的字符串。

    如果你有非标准的 cmets,我会推荐一个像这样的正则表达式:

    import re
    xml = """<Content>
       <tags>
       asd
       </tags>
    <![CDATA["string1"; "string2"; ....]]>
    </Content>"""
    for i in re.findall("<!.+>",xml):
        for j in re.findall('\".+\"', i):
            print(j)
    

    返回:"string1"; "string2"

    【讨论】:

      【解决方案3】:

      使用 Python 3.8,您可以在元素树中插入注释

      在 XML 中读取属性、值、标记和注释的示例代码

      import csv, sys
      import xml.etree.ElementTree as ET
      
      
      parser = ET.XMLParser(target=ET.TreeBuilder(insert_comments=True))  # Python 3.8
                  tree = ET.parse(infile_path, parser)
      
                  csvwriter.writerow(TextWorkAdapter.CSV_HEADERS)
      
                  COMMENT = ""
                  TAG =""
                  NAME=""
      
                  # Get the comment nodes
                  for node in tree.iter():
                      if "function Comment" in str(node.tag):
                          COMMENT = node.text
                      else:
                          #read tag
                          TAG = node.tag  # string
      
                          #read attributes 
                          NAME= node.attrib.get("name")  # ID
                            
                          #Value
                          VALUE = node.text  # value
      
                          print(TAG, NAME, VALUE, COMMENT)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-27
        • 2012-08-15
        • 2014-01-15
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多