计算 XML 目录中元素内的单词出现次数

问题描述

我有一个包含 XML 文件文件夹,我正在尝试计算一个元素中特定单词的出现次数。更具体地说,我想计算文件夹中所有 XML 中的 ,例如,单词“Impfstoff”(在元素“mpeg7text:Keyword”中)的出现次数。 XML 如下所示:


<?xml version="1.0" encoding="UTF-8" standalone="true"?>

-<Description xsi:type="ContentEntityType">

   -<MultimediaContent xsi:type="mpeg7text:TextType">

      -<mpeg7text:Text>

         -<mpeg7text:ModelMetadata>
             <mpeg7text:Version>tfidf_newmodel</mpeg7text:Version>
         </mpeg7text:ModelMetadata>

         -<mpeg7text:TextDescriptor xsi:type="mpeg7text:KeywordExtractionType">

         -<mpeg7text:Keyword>

           <mpeg7text:Keyword>Impfstoff</mpeg7text:Keyword>
           <mpeg7text:Relevance>121.58288081128799</mpeg7text:Relevance>
           <mpeg7text:Frequency>22</mpeg7text:Frequency>
           <mpeg7text:Confidence>1.0</mpeg7text:Confidence>

         </mpeg7text:Keyword>

我到目前为止的代码是:

import os
import lxml.etree as et
for filename in os.listdir(path):
    if not filename.endswith('.xml'): continue
    if filename.endswith('.xml'):
        fullname = os.path.join(path,filename)
        root = et.parse(fullname)
        root.xpath('count(.//mpeg7text:Keyword/mpeg7text:Keyword[.=Corona])')

但我收到此错误

XPathEvalError                            Traceback (most recent call last)
<ipython-input-11-0ca6983bfdd7> in <module>
      7         #root = tree.getroot(tree)
      8         root = et.parse(fullname)
----> 9         root.xpath('count(.//mpeg7text:Keyword/mpeg7text:Keyword[.=Corona])')

src/lxml/etree.pyx in lxml.etree._ElementTree.xpath()

src/lxml/xpath.pxi in lxml.etree.XPathDocumentEvaluator.__call__()

src/lxml/xpath.pxi in lxml.etree._XPathEvaluatorBase._handle_result()

XPathEvalError: Undefined namespace prefix

我有点迷失了现在要怎么做才能计算元素 mpeg7text:Keyword 中的单词 有没有人以前做过这样的事情并且可以在这里提供帮助?那太棒了!

干杯!

解决方法

要在 Python 中使用命名空间,请参阅 this answer

作为替代 XPath,您可以使用:

root.xpath("count(.//*[local-name()='Keyword']/*[local-name()='Keyword'][text()='Corona'])")

查看“Corona”周围引号的使用。

但是由于您已经使用了 // 并因此找到了所有 Keyword 元素,您也可以使用:

root.xpath("count(.//*[local-name()='Keyword'][text()='Corona'])")
,

如果您切换到 XPath 2.0+(使用 Saxon/C 库在 Python 中可用),那么您可以使用单个 XPath 表达式搜索整个目录:

count(collection('my/folder?select=*.xml')//*:Keyword[.='Impfstoff'])