我从上面的.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))
有人能提出更正建议吗。。在
xmltodict可能很难用于您的数据。PMC杂志上的文章绝对是作者可能想到的。在xmltodict中除了最琐碎的XML之外,将其他任何XML放入xmltodict中都是将一个圆钉敲入一个方孔中,您可能会成功,但这不会很好。我在下面的“tldr”下对此作了进一步的解释。。。。在
相反,我建议您使用一个数据模型更适合您的数据的库,例如xml.dom文件、minidom或BeautifulSoup的最新版本。在许多这样的库中,只需通过一次调用加载文档,然后调用诸如innerText()之类的函数来获取文档的所有文本内容。您甚至可以将文档加载到浏览器中并调用Javascript innerText()函数来获得所需内容。如果您选择的工具尚未提供innertext(),则它是:
您可以根据您的数据对其进行调整,在文本节点之间放置空格。在
希望有帮助。在
==tldr==
xmltodict在使XML“尽可能简单”方面做了令人钦佩的尝试;但它在使XML变得比可能更简单方面犯了错误。在
xmltodict的工作原理是将每个元素转换为dict,其子元素作为dict项,由元素名称键入。但在许多情况下(比如您的情况),XML数据根本就不是这样。例如,一个元素可以有许多同名的子元素,但是dict不能
所以xmltodict必须做一些特别的事情。它将同一元素类型的相邻实例转换为数组(不包含元素类型)。以下是从https://github.com/martinblech/xmltodict摘录的示例:
^{pr2}$变成:
首先,这意味着xmltodict总是丢失有关子元素的排序信息,除非它们属于同一类型。因此,一个包含段落、列表、块引号等的部分,要么无法加载到xmltodict中,要么将每种子类的所有分散实例聚集在一起,完全失去顺序。在
xmltodict方法还引入了常见的特殊情况—例如,您不能只获取所有子元素的列表,或者使用len()来确定有多少个子元素,等等,因为在每一步中,您都必须检查您是否真正在子元素中,还是在它们的列表中。在
看一下xmltodict自己的示例,您会发现它们主要是按元素名遍历树,但有时会有一个整数下标,用于需要这些数组的情况。但除非数据异常简单(你的数据不是),否则你不知道它在哪里。例如,如果一个HTML文档中的一个DIV碰巧只包含一个P,那么访问P的代码所需的下标要比另一个恰好有多个P的DIV少一个下标
在我看来,获取某个东西的下标的数量取决于它有多少兄弟姐妹,以及它们的类型,这似乎是不可取的。在
唉,结构还不够好。因为子元素可能有自己的子元素,所以仅仅在额外的数组中使它们成为字符串是不够的。有时它们必须再次是dicts,它们的一些项反过来可能是数组,其中一些项可能是dict,等等。编写正确的遍历算法来收集文本比上面所示的DOM算法要困难得多。在
公平地说,存在一些顺序与逻辑无关的XML,例如,可以将SQL表导出到XML文件中,对每个记录使用一个container元素,每个字段有一个子元素。字段的顺序不是信息,因此,如果将此类XML加载到xmltodict中,则失去顺序无关紧要。同样地,如果你序列化了Python数据,这些数据已经了只是一个dict。对于这种情况,xmltodict可能是一个很好的选择,但是您所看到的文章与此相差甚远。
相关问题 更多 >
编程相关推荐