我是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'
您应该能够通过内置的
minidom
xml解析器来实现这一点。在在您的示例中,firstNode的结果是:
^{pr2}$注意minidom(可能还有您可能使用的任何其他xml解析库)在默认情况下无法识别HTML。这是设计的,因为XML文档没有预定义的标记。在
然后,可以使用一系列
if
或try
语句来确定在提取数据时是否已到达HTML格式的节点:我不认为有一种简单的方法可以修改XML解析器的行为来忽略一些预定义的标记。一种更简单的方法是让解析器正常地解析XML,然后可以为此创建一个返回元素未解析内容的函数,例如:
输出:
^{pr2}$相关问题 更多 >
编程相关推荐