如何获取XML标记中的所有文本

2024-04-29 06:30:53 发布

您现在位置:Python中文网/ 问答频道 /正文

xml file snapshot

我从上面的.xml文件中提取文章id、文章标题、摘要和关键字。对于单个标记内的普通文本,获得正确的结果。但是带有多个标记的文本,例如:

 <title-group>
   <article-title>
      Acetylcholinesterase-Inhibiting Activity of Pyrrole Derivatives from a Novel Marine Gliding Bacterium,
     <italic>Rapidithrix thailandica</italic>
   </article-title>
 </title-group>
 .
 .
 same is for abstract...

我得到的输出是:

^{pr2}$

代码将标签视为文本,生成的o/p也不在序列中。在

如何简单地从输入文档中提取文本,如“新型海洋滑翔细菌Rapidithrix thailandica吡咯衍生物的乙酰胆碱酯酶抑制活性”。

我使用下面的python代码来执行上面的任务。。在

import xmltodict
import os
from os.path import basename
import re


with open('2630847.nxml') as fd:
    doc = xmltodict.parse(fd.read())
    pmc_id = doc['article']['front']['article-meta']['article-id'][1]['#text']

    article_title = doc['article']['front']['article-meta']['title-group']['article-title']

    y = doc['article']['front']['article-meta']['abstract']
    y = y.items()[0]
    article_abstract = [g.encode('ascii','ignore') for g in y][1]

    z = doc['article']['front']['article-meta']['kwd-group']['kwd']
    zz = [g.encode('ascii','ignore') for g in z]
    article_keywords = ",".join(zz).replace(","," ")


    fout = open(str(pmc_id)+".txt","w")
    fout.write(str(pmc_id)+"\n"+str(article_title)+". "+str(article_abstract)+". "+str(article_keywords))

有人能提出更正建议吗。。在


Tags: 文本importabstractidfordoctitlearticle
1条回答
网友
1楼 · 发布于 2024-04-29 06:30:53

xmltodict可能很难用于您的数据。PMC杂志上的文章绝对是作者可能想到的。在xmltodict中除了最琐碎的XML之外,将其他任何XML放入xmltodict中都是将一个圆钉敲入一个方孔中,您可能会成功,但这不会很好。我在下面的“tldr”下对此作了进一步的解释。。。。在

相反,我建议您使用一个数据模型更适合您的数据的库,例如xml.dom文件、minidom或BeautifulSoup的最新版本。在许多这样的库中,只需通过一次调用加载文档,然后调用诸如innerText()之类的函数来获取文档的所有文本内容。您甚至可以将文档加载到浏览器中并调用Javascript innerText()函数来获得所需内容。如果您选择的工具尚未提供innertext(),则它是:

def innertext(node):
    t = ""
    for curNode in node.childNodes:
        if (isinstance(curNode, Text)):
            t += curNode.nodeValue
        elif (isinstance(curNode, Element)):
            t += curNode.innerText
    return(t)

您可以根据您的数据对其进行调整,在文本节点之间放置空格。在

希望有帮助。在

==tldr==

xmltodict在使XML“尽可能简单”方面做了令人钦佩的尝试;但它在使XML变得比可能更简单方面犯了错误。在

xmltodict的工作原理是将每个元素转换为dict,其子元素作为dict项,由元素名称键入。但在许多情况下(比如您的情况),XML数据根本就不是这样。例如,一个元素可以有许多同名的子元素,但是dict不能

所以xmltodict必须做一些特别的事情。它将同一元素类型的相邻实例转换为数组(不包含元素类型)。以下是从https://github.com/martinblech/xmltodict摘录的示例:

^{pr2}$

变成:

"and": {
    "many": [
        "elements", 
        "more elements"
    ]
}, 

首先,这意味着xmltodict总是丢失有关子元素的排序信息,除非它们属于同一类型。因此,一个包含段落、列表、块引号等的部分,要么无法加载到xmltodict中,要么将每种子类的所有分散实例聚集在一起,完全失去顺序。在

xmltodict方法还引入了常见的特殊情况—例如,您不能只获取所有子元素的列表,或者使用len()来确定有多少个子元素,等等,因为在每一步中,您都必须检查您是否真正在子元素中,还是在它们的列表中。在

看一下xmltodict自己的示例,您会发现它们主要是按元素名遍历树,但有时会有一个整数下标,用于需要这些数组的情况。但除非数据异常简单(你的数据不是),否则你不知道它在哪里。例如,如果一个HTML文档中的一个DIV碰巧只包含一个P,那么访问P的代码所需的下标要比另一个恰好有多个P的DIV少一个下标

在我看来,获取某个东西的下标的数量取决于它有多少兄弟姐妹,以及它们的类型,这似乎是不可取的。在

唉,结构还不够好。因为子元素可能有自己的子元素,所以仅仅在额外的数组中使它们成为字符串是不够的。有时它们必须再次是dicts,它们的一些项反过来可能是数组,其中一些项可能是dict,等等。编写正确的遍历算法来收集文本比上面所示的DOM算法要困难得多。在

公平地说,存在一些顺序与逻辑无关的XML,例如,可以将SQL表导出到XML文件中,对每个记录使用一个container元素,每个字段有一个子元素。字段的顺序不是信息,因此,如果将此类XML加载到xmltodict中,则失去顺序无关紧要。同样地,如果你序列化了Python数据,这些数据已经只是一个dict。对于这种情况,xmltodict可能是一个很好的选择,但是您所看到的文章与此相差甚远。

相关问题 更多 >