繁体   English   中英

如何在XML标签中获取所有文本

[英]How to get all text inside XML tags

xml文件快照

从上面的.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...

我得到的输出为:

  OrderedDict([(u'italic**', u'Rapidithrix thailandica'), ('#text', u'Acetylcholines terase-Inhibiting Activity of Pyrrole Derivatives from a Novel Marine Gliding Ba cterium,')])

代码已将标签视为文本,并且生成的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期刊文章绝对不是作者本可以想到的。 将最琐碎的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“尽可能简单”。 但是恕我直言,它使它变得比可能更简单是错误的。

xmltodict基本上是通过将每个元素变成一个dict来工作的,其子元素作为dict项,由它们的元素名称作为关键字。 但是在很多情况下(例如您的情况),XML数据根本就不一样。 例如,一个元素可以有多个具有相同名称的子代,而字典则不能。

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

<and>
  <many>elements</many>
  <many>more elements</many>
</and>

变成:

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

首先,这意味着xmltodict总是丢失有关子元素的排序信息,除非它们是同一类型。 因此,包含段落,列表,块引用等的混合部分将无法加载xmltodict,或者将各种子项的所有分散实例聚集在一起,从而完全失去顺序。

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

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

在我看来,到达某个对象的下标数量取决于它具有多少同级兄弟及其类型,似乎是不可取的。

las,结构仍然不够好。 由于子元素可能具有自己的子元素,因此仅使它们成为该额外数组中的字符串是不够的。 有时,它们将不得不再次成为字典,其某些项目又可能是数组,其中某些项目可能是字典,依此类推。 与上面显示的DOM相比,编写正确的遍历算法来收集文本要困难得多。

要完全公平的, 一些XML中的顺序并不重要逻辑-例如,你可以在SQL表导出到一个XML文件,并使用一个容器元素与每个字段的子元素的每个记录。 字段的顺序不是信息,因此,如果将此类XML加载到xmltodict中,则失去顺序无关紧要。 同样,如果您序列化了已经只是字典的Python数据。 但是这些都是非常特殊的边缘情况。 对于这样的情况,xmltodict可能是一个不错的选择-但是您正在看的文章与之相去甚远。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM