使用ElementTree在节点内插入HTML
我正在使用ElementTree来解析一个XML文件。在某些字段中,会有HTML数据。比如,考虑下面这个声明:
<Course>
<Description>Line 1<br />Line 2</Description>
</Course>
现在,假设_course是一个元素变量,它保存了这个课程元素。我想获取这个课程的描述,所以我这样做:
desc = _course.find("Description").text;
但是desc只包含“第一行”。我看到关于.tail属性的一些内容,所以我也尝试了:
desc = _course.find("Description").tail;
结果还是一样。我该怎么做才能让desc变成“第一行
第二行”(或者说任何在和之间的内容)?换句话说,我想要的东西类似于C#中的.innerText属性(我想其他很多语言也是这样)。
4 个回答
像"<"和"&"这样的字符在XML元素中是不能用的。
"<"会出错,因为解析器会把它当成一个新元素的开始。
"&"也会出错,因为解析器会把它当成一个字符实体的开始。
一些文本,比如JavaScript代码,里面会有很多"<"或"&"字符。为了避免出错,可以把脚本代码定义为CDATA。
CDATA部分里的内容会被解析器忽略。
CDATA部分是以"
想了解更多信息,可以查看这个链接:http://www.w3schools.com/xmL/xml_cdata.asp
希望这些信息对你有帮助!
你正在从错误的元素中读取尾部属性。试试这个:
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-text-helper/。你可以根据自己的需要进行修改。
附言:我把我的名字从user839338改成了下一个帖子中引用的名字。
你有没有办法控制xml文件的创建?在xml标签里面的内容,如果也包含xml标签或者一些特殊字符(比如'<
'),就需要进行编码,以避免出现问题。你可以通过以下几种方式来做到这一点:
- 使用一个CDATA部分
- 使用Base64或者其他不包含xml保留字符的编码方式
- 使用实体编码(比如'
<
'等于'<
')
如果你不能做这些修改,而且ElementTree又无法忽略不在xml模式中的标签,那么你就需要先处理这个文件。当然,如果这个模式和html有重叠,那你就比较麻烦了。