【问题标题】:Python lxml library fails to parse &lt; and &gt;Python lxml 库无法解析 < 和 >
【发布时间】:2013-10-01 18:33:18
【问题描述】:

我有一个带有 javascript 的 XSLT,它使用“<”和“>”在for循环内

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
  <head> </head>
  <body>
    <script language="javascript" type="text/javascript">
  function example() {
        var trs = document.getElementsByTagName("tr");
    for (var i = 0; i &lt; trs.length; i++) {
    }
      }
     </script>
  </body>
</html>

我正在使用 PYTHON LXML 库通过 XSLT 和 XML 生成 HTML。

import lxml.etree as ET
xml = ET.parse('sample.xml')
xslt = ET.parse('sample.xsl')
transform = ET.XSLT(xslt)
content = transform(xml)
f = open('output.html','w')
f.write(ET.tostring(content , pretty_print=True))
f.close()

但 LXML 无法替换输出 HTML 文件中的特殊字符

'

是否有任何使用 LXML 替换“&lt ;”的标准做法到'

为了解决这个问题,我必须在写入文件之前编写另一段代码。

content = content.replace("&gt;", ">")
content = content.replace("&lt;", "<")

【问题讨论】:

    标签: javascript python xml xml-parsing lxml


    【解决方案1】:

    为了解码/转换 HTML 实体,您应该在 tostring() 调用中使用 method="html"

    ET.tostring(content, method="html", pretty_print=True)
    

    或:

    lxml.html.tostring(content, pretty_print=True)
    

    演示:

    from lxml import etree
    
    
    text = """<html>
      <body>
        <script> 1 &lt; 2 </script>
      </body>
    </html>
    """
    
    tree = etree.fromstring(text)
    print etree.tostring(tree, method="html")
    

    打印:

    <html>
      <body>
        <script> 1 < 2 </script>
      </body>
    </html>
    

    【讨论】:

    • 我注意到这个技巧只有在标签是“脚本”而不是“正文”或其他东西时才有效。
    【解决方案2】:

    您也可以将脚本内容包含在 CDATA 包装器中以阻止它被吃掉,如下所示:

    <script language="javascript" type="text/javascript">
      <![CDATA[
        function example() {
              var trs = document.getElementsByTagName("tr");
          for (var i = 0; i < trs.length; i++) {
          }
        }
      ]]>
    </script>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 2018-09-12
      • 2010-12-07
      • 1970-01-01
      • 2012-06-10
      • 2013-09-26
      相关资源
      最近更新 更多