使用 ElementTree 的 HTML 内部节点
-
23-08-2019 - |
题
我正在使用 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 保留字符)
- 实体编码('
<
'==
'<
')
如果您无法进行这些更改,并且 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
希望这有助于!
,我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>