在Python中解析自定义XML标记而不解析HTML

2024-09-27 23:15:26 发布

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

我是python2.7的新手,我试图解析一个包含HTML的XML文件。我想解析自定义XML标记,而不解析任何HTML内容。最好的办法是什么?(如果有帮助的话,我的自定义XML标记列表很小,因此如果有一个XML解析器可以选择只解析指定的标记,那么它可能会很好地工作。)

例如,我有一个XML文件

<myTag1 myAttrib="value">
  <myTag2>
    <p>My what a lovely day.</p>
  </myTag2>
</myTag1>

我希望能够解析除HTML之外的所有内容,尤其是将myTag2的值提取为未解析的HTML。在

编辑:这里有更多的信息来回答下面的问题。我以前试过使用ElementTree。事情是这样的:

^{pr2}$

我想要的HTML字符串已被解析并存储为标记和文本:

root[0][0].tag  # returns 'p', but I don't even want root[0][0] to exist
root[0][0].text  # returns 'My ... day.'

但我真的希望能做这样的事。。。在

root[0].unparsedtext  # returns '<p>My ... day.</p>'

解决方案:

哈07的回答很有效。我稍微修改了一下代码以解释边缘情况。我要实现的是:

def _getInner(element):
    if element.text == None:
        textStr = ''
    else:
        textStr = element.text
    return textStr + ''.join(ET.tostring(e) for e in element)

那么如果

element = ET.fromstring('<myTag>Let us be <b>gratuitous</b> with tags</myTag>')

原始代码将只返回以第一个XML格式标记开始的文本,但修改后的版本将捕获所需的文本:

''.join(ET.tostring(e) for e in element)  # returns '<b>gratuitous</b> with tags'

_getInner(element)  # returns 'Let us be <b>gratuitous</b> with tags'

Tags: text标记文本myhtmlwithrootxml
2条回答

您应该能够通过内置的minidomxml解析器来实现这一点。在

from xml.dom import minidom

xmldoc = minidom.parse("document.xml")
rootNode = xmldoc.firstChild
firstNode = rootNode.childNodes[0]

在您的示例中,firstNode的结果是:

^{pr2}$

注意minidom(可能还有您可能使用的任何其他xml解析库)在默认情况下无法识别HTML。这是设计的,因为XML文档没有预定义的标记。在

然后,可以使用一系列iftry语句来确定在提取数据时是否已到达HTML格式的节点:

for i in range (0, len(rootNode))
    rowNode = rootNode.childNodes[i]
    if "<p>" in rowNode:
         #this is an html-formatted node: extract the value and continue

我不认为有一种简单的方法可以修改XML解析器的行为来忽略一些预定义的标记。一种更简单的方法是让解析器正常地解析XML,然后可以为此创建一个返回元素未解析内容的函数,例如:

import xml.etree.ElementTree as ET

def getUnparsedContent(element):
    return ''.join(ET.tostring(e) for e in element)

xmlstring = """<myTag1 myAttrib="value">
  <myTag2>
    <p>My what a lovely day.</p>
  </myTag2>
</myTag1>"""

root = ET.fromstring(xmlstring)
print(getUnparsedContent(root[0]))

输出:

^{pr2}$

相关问题 更多 >

    热门问题