我正在使用 ElementTree 来解析 XML 文件。在某些字段中,会有 HTML 数据。例如,考虑如下声明:

<Course>
    <Description>Line 1<br />Line 2</Description>
</Course>

现在,假设 _course 是一个保存此 Couse 元素的 Element 变量。我想访问本课程的描述,所以我这样做:

desc = _course.find("Description").text;

但 desc 只包含“Line 1”。我读到了一些关于 .tail 属性的内容,所以我也尝试了:

desc = _course.find("Description").tail;

我得到相同的输出。我应该怎么做才能使 desc 成为“第 1 行
第 2 行”(或者字面意义上的 和 之间的任何内容)?换句话说,我正在寻找类似于 C#(以及我猜的许多其他语言)中的 .innerText 属性的内容。

有帮助吗?

解决方案

您可以控制 xml 文件的创建吗?包含 xml 标签(或类似标签)或标记字符('<'等)应该进行编码以避免这个问题。您可以使用以下任一方法执行此操作:

  • A 数据中心 部分
  • Base64 或其他一些编码(不包括 xml 保留字符)
  • 实体编码('<' == '&lt;')

如果您无法进行这些更改,并且 ElementTree 无法忽略未包含在 xml 架构中的标签,那么您将必须预处理该文件。当然,如果模式与 html 重叠,你就不走运了。

其他提示

您正试图读取错误的元素的尾属性。尝试

desc = _course.find("br").tail;

尾部属性用于存储尾随读取混合内容的XML文件时,文本节点;一个元件之后直接如下文本被存储在该元素的属性尾:

    <tag><elem>this goes into elem's
    text attribute</elem>this goes into
    elem's tail attribute</tag>

简单代码段打印文本和尾部从XML / XHTML所有元素的属性。

import xml.etree.ElementTree as ET

def processElem(elem):
    if elem.text is not None:
        print elem.text
    for child in elem:
        processElem(child)
        if child.tail is not None:
            print child.tail

xml = '''<Course>
    <Description>Line 1<br />Line 2 <span>child text </span>child tail</Description>
    </Course>'''

root = ET.fromstring(xml)
processElem(root)

输出:

Line 1
Line 2 
child text 
child tail

请参阅 http://code.activestate.com/recipes/498286- ElementTree的文本辅助/ 一个更好的解决方案。可以对其进行修改,以适应。

P.S。我从user839338改变了我的名字报价在接下来的文章

像字符 “<” 和 “&” 是在XML元素是非法的。

“<”会因为解析器将其解释为一个新元素的开始产生一个错误。

“&”会因为解析器将其解释为一个字符实体的开始产生一个错误。

某些文本,如JavaScript代码,含有大量的“<”或“&”字符。为了避免错误的脚本代码可以被定义为CDATA。

CDATA区段内的所有内容被分析器忽略。

一个CDATA部件以 “” 开头:

上的更多信息: http://www.w3schools.com/xmL/xml_cdata.asp

希望这有助于!

通过 user839338的回答启发

,我wen't神情对于合理的解决方案,它看起来有点像这样。

>>> from xml.etree import ElementTree as etree
>>> corpus = '''<Course>
...     <Description>Line 1<br />Line 2</Description>
... </Course>'''
>>> 
>>> doc = etree.fromstring(corpus)
>>> desc = doc.find("Description")
>>> desc.tag = 'html'
>>> etree.tostring(desc)
'<html>Line 1<br/>Line 2</html>\n'
>>> 

有以消除周围的标签(最初<Description>)没有简单的方法,但它很容易修改成东西,可以根据需要使用,例如<div><span>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top