从具有最小度的节点列表中删除第一个和最后一个节点

时间:2018-07-23 13:26:29

标签: python xml dom xml-parsing minidom

我正在研究XML解析,并且我一直在使用minidom。文件中使用了许多自定义定义的实体,因此使用lxml一直很麻烦。 DOM似乎忽略了这一点,因此对于我目前的工作,我正在使用DOM。

我需要从xml中获取所有<para>标签,并在标签内获取所有内部文本。然后,我需要删除标签的第一次出现和最后一次出现,并获取其余标签及其内部文本中的所有文本。到目前为止,这是我的代码:

file='C:/My_Folders/something.xml'
doc=parse(file)
paras=doc.getElementsByTagName('para')

def getText(paras):
    rc = []
    for node in paras:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
        else:
            rc.append(getText(node.childNodes))

    return ','.join(rc)

print(getText(paras))

在这段代码中,我从不需要的所有<para>标记中获取了所有文本。我不希望<para>标签的第一次和最后一次出现。有人可以帮我吗?

这是示例XML。

<para
><reviewer-note >tlewis</reviewer-note
></para>
<para><user-typing>Resilient.</para>
<para>hashing.</para>
<para>"X" release.</para>
<para>[See <url
href="http://www.google.com"
>Trunk/ECMP Groups</url>.]</para>

我不希望第一个标签文本。即tlewis,以及最后一个标记文字。即中继/ ECMP组。我希望其他<para>标签文本(例如Resilient,哈希和“ X”)发布并连接这3个。

所需的输出: 弹性,散列,“ X”版本

1 个答案:

答案 0 :(得分:0)

您可以使用BeautifulSoup解析XML。在我的示例中,我使用<para>方法选择了所有select()标签,然后将它们串联在一起(没有第一个和最后一个):

data = """<para
><reviewer-note >tlewis</reviewer-note
></para>
<para><user-typing>Resilient.</para>
<para>hashing.</para>
<para>"X" release.</para>
<para>[See <url
href="http://www.google.com"
>Trunk/ECMP Groups</url>.]</para>"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'lxml')

all_params = soup.select('para')[1:-1]

string_output = ''
for param in all_params:
    string_output += param.text.strip() + ','
string_output = string_output.rstrip(',')

print(string_output)

输出:

Resilient.,hashing.,"X" release.