【问题标题】:HTML inside node using ElementTree使用 ElementTree 的节点内的 HTML
【发布时间】:2009-07-06 18:17:47
【问题描述】:

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

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

现在,假设 _course 是一个包含该 Couse 元素的 Element 变量。我想访问这门课程的描述,所以我这样做了:

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

然后 desc 只包含“第 1 行”。我读了一些关于 .tail 属性的东西,所以我也尝试了:

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

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

【问题讨论】:

    标签: python html xml elementtree


    【解决方案1】:

    您对 xml 文件的创建有任何控制权吗?应对包含 xml 标签(或类似标签)或标记字符('&amp;lt;'等)的 xml 标签的内容进行编码以避免此问题。您可以使用以下任一方法:

    • CDATA 部分
    • Base64 或其他一些编码(不包括 xml 保留字符)
    • 实体编码('&amp;lt;'=='&amp;lt;')

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

    【讨论】:

      【解决方案2】:

      您正试图从错误的元素中读取 tail 属性。试试

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

      tail 属性用于在读取混合内容的 XML 文件时存储尾随文本节点;紧跟在元素之后的文本存储在该元素的 tail 属性中:

      这进入了elem的 文本属性这进入 elem 的尾部属性

      简单的代码 sn-p 打印 xml/xhtml 中所有元素的文本和尾部属性。

      将 xml.etree.ElementTree 导入为 ET def processElem(elem): 如果 elem.text 不是无: 打印元素.text 对于 elem 中的孩子: processElem(孩子) 如果 child.tail 不是无: 打印child.tail xml = ''' 第 1 行
      第 2 行 子文本子尾部
      课程>''' 根 = ET.fromstring(xml) processElem(根)

      输出:

      1号线 2号线 子文本 孩子尾巴

      请参阅http://code.activestate.com/recipes/498286-elementtree-text-helper/ 以获得更好的解决方案。它可以修改以适应。

      附:我将我的名字从 user839338 更改为下一篇文章中引用的内容

      【讨论】:

      • 我几乎看不到我在这种情况下使用的解决方案作为解决方法。对 Description 属性的内容进行编码只是意味着该属性内容中包含的任何语义都超出了主要 XML 树所描述的语义范围。
      • 这里的不同之处在于,公认的解决方案基本上将编码文档视为不透明的二进制实体,这可能很好,并且在特定封闭文档的语义中有意义,但如果封闭文档的特定实体预期是html,则将xHTML视为文档的一部分可能在语义上更有用,而不仅仅是payload
      【解决方案3】:

      像“

      "

      "&" 将产生错误,因为解析器将其解释为字符实体的开始。

      有些文本,比如 JavaScript 代码,包含很多“

      解析器会忽略 CDATA 部分中的所有内容。

      CDATA 部分以“”开头:

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

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        user839338's answer的启发,我没有去寻找一个合理的解决方案,看起来有点像这样。

        >>> 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'
        >>> 
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-11
          • 2015-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多