在 lxml 中定义默认命名空间(无前缀)

2024-04-28

当使用 lxml 渲染 XHTML 时,一切都很好,除非您碰巧使用 Firefox,它似乎无法处理以名称空间为前缀的 XHTML 元素和 javascript。虽然 Opera 能够很好地执行 javascript(这适用于 jQuery 和 MathJax),但无论 XHTML 命名空间是否有前缀 (h:在我的例子中)或没有,在 Firefox 中脚本将因奇怪的错误而中止(this.head未定义以 MathJax 为例)。

我知道关于register_namespace函数,但它既不接受None nor ""作为命名空间前缀。我听说过_namespace_map in the lxml.etree模块,但我的Python抱怨这个属性不存在(版本问题?)

是否有其他方法删除 XHTML 命名空间的命名空间前缀?注意str.replace正如另一个相关问题的答案中所建议的,是not这是我可以接受的方法,因为它不了解 XML 语义,并且可能很容易搞砸生成的文档。

根据要求,您会发现两个可供使用的示例。一与命名空间前缀 http://sotecware.net/files/persistent/so-lxml-xhtml/js-test-prefixed.xhtml and 一个没有 http://sotecware.net/files/persistent/so-lxml-xhtml/js-test.xhtml。第一个将在 Firefox 中显示 0(错误),第二个将显示 1(正确)。 Opera 将正确渲染两者。这显然是火狐浏览器的一个错误 https://bugzilla.mozilla.org/show_bug.cgi?id=492933,但这只是希望使用 lxml 实现无前缀 XHTML 的理由 – 还有其他很好的理由可以减少移动客户端等的流量(甚至h:如果您考虑数十或数百个 html 标签,则数量相当多)。


Use ElementMaker并给它一个nsmap那个地图None到您的默认名称空间。

#!/usr/bin/env python
# dogeml.py

from lxml.builder import ElementMaker
from lxml import etree

E = ElementMaker(
    nsmap={
        None: "http://wow/"    # <--- This is the special sauce
    }
)

doge = E.doge(
    E.such('markup'),
    E.many('very namespaced', syntax="tricks")
)

options = {
    'pretty_print': True,
    'xml_declaration': True,
    'encoding': 'UTF-8',
}

serialized_bytes = etree.tostring(doge, **options)
print(serialized_bytes.decode(options['encoding']))

正如您在此脚本的输出中所看到的,定义了默认命名空间,但标签没有前缀。

<?xml version='1.0' encoding='UTF-8'?>
<doge xmlns="http://wow/">
   <such>markup</such>
   <many syntax="tricks">very namespaced</many>
</doge>

我已使用 Python 2.7.6、3.3.5 和 3.4.0 结合 lxml 3.3.1 测试了此代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 lxml 中定义默认命名空间(无前缀) 的相关文章

随机推荐

  • Pytorch Tensor 如何获取元素索引? [复制]

    这个问题在这里已经有答案了 我有 2 个名为x and list它们的定义如下 x torch tensor 3 list torch tensor 1 2 3 4 5 现在我想获取元素的索引x from list 预期输出是一个整数 2
  • 如何从 C# 中的显示名称获取 Active Directory 中的用户名?

    我希望能够使用 Active Directory 中用户的显示名称来获取该用户的用户 ID 显示名称是从数据库中获取的 并且已在该用户会话期间使用以下代码来存储以获取显示名称 using System DirectoryServices A
  • Dim As New 与 Dim / Set 有什么区别

    在 VBA 中 我可以通过以下两种方式之一创建对象 First way Dim myCol1 As New Collection Second way Dim myCol2 As Collection Set myCol2 New Coll
  • 可以通过robotium在测试用例中打开/关闭wifi吗

    我们可以在 Robotium 的测试用例中打开 关闭设备的 Wi Fi 吗 因为我正在测试一个问题 需要在初始阶段打开 wifi 然后关闭 wi fi 并继续测试 是的 你可以做到 请参阅示例 公共无效testNoNetworkConnec
  • “res.render”有什么作用,html 文件是什么样的?

    什么是res render做什么 html 文件是什么样的 我的最终目标是将文本文件中的任意逗号分隔值加载到 html 文件中 例如 我只能推断视图是 html 文件 并且回调返回该 html 文件 这是文档 http expressjs
  • ruby 2.1.2超时仍然不是线程安全的吗?

    我有 50 个 sidekiq 线程在网络上爬行 几周前 这些线程在运行大约 20 分钟后开始挂起 当我执行回溯转储时 大多数线程都卡在 net http 初始化上 app vendor ruby 2 1 2 lib ruby 2 1 0
  • 跨线程操作无效:从创建它的线程以外的线程访问控制“dataGridView1”[重复]

    这个问题在这里已经有答案了 我有一个 Windows 表单 需要很长时间才能将数据加载到我的 datagridview 中 我不断收到这一行的错误 dataGridView1 Rows Add row 跨线程操作无效 控制 dataGrid
  • 如何处理“IllegalStateException:BeanFactory 未初始化或已关闭”?

    使用 Tomcat 7 上的 Grails 2 0 0 我在启动时得到以下结果 2011 08 21 11 10 09 758 main ERROR StackTrace Full Stack Trace java lang Illegal
  • 通过从数组添加对象来数组?

    我不确定我在这里做错了什么 我尝试了各种组合来尝试将数组复制到变量 mmm 中 我正在尝试学习如何创建 2D 数组 然后运行循环将 init array 放入 10 列 NSMutableArray mmm NSMutableArray a
  • 使用 UIAlertView 以编程方式退出 iOS 应用程序

    我正在通过以下方法中止我的 iOS 应用程序 void cancelSelected UIAlertView alert UIAlertView alloc initWithTitle nil message Are you sure yo
  • 在 R 中导入 png 文件并转换为动画(.mp4)

    我正在尝试用 R 中的几个 png 文件创建一个简短的动画 我尝试了 packagemagick但只有当我将它们保存为 gif 时它才有效 当我尝试另存为 mp4 时 它将生成一个 mp4 文件 但一旦打开它 只会显示第一张图像 我的代码是
  • FluentValidation 集合属性未验证

    这是我第一次尝试实现 FluentValidation 因为我需要涵盖复杂的验证场景 我试图验证的类具有大量属性 复杂对象和多个集合 我没有遇到验证主类的属性的问题 甚至检查集合是否不为空 但在验证每个集合中的对象属性时确实遇到了问题 为了
  • 如何使用 Curl CLI 执行 OAuth 2.0?

    我想在 Windows 命令提示符下使用curl 来执行Google OAuth 2 0 我的目标是更好地理解 OAuth 服务器实现的身份验证流程 查看 HTTP 标头等 如何在 Windows 命令提示符下使用curl exe 来完成此
  • 带有mysql的实体框架,linux和windows之间的表大小写问题

    我们目前正在开发一个使用 Code First Entity Framework 和 Mysql 的产品 开发数据库托管在 Windows 环境中 而生产 mysql 则托管在 Linux 环境中 我遇到的问题是 mysql 中的表命名如下
  • R 分号将列分隔为行

    我正在使用 RStudio 2 15 0 并使用 XLConnect 从 Excel 创建了一个包含 3000 多行和 12 列的对象 我试图将一列分隔 拆分为行 但不知道这是否可能或如何执行 下面的数据示例使用 3 列连接 对此的任何帮助
  • X509 C# 指南/教程

    谁能给我提供有关 X509 证书的良好介绍材料以及 C 示例 你可以从这里开始 X509证书 MSDN 资源 http msdn microsoft com en us library system security cryptograph
  • 获取登录用户的id

    如何获取登录用户的UserId 我正在使用标准系统生成的 AccountModel 我可以使用以下方式获取用户名 User Identity Name 但我没有看到 UserId 字段 我想使用 UserId 作为另一个表的外键 尝试这个
  • 如何使用 SQLAlchemy 进行“mysql 解释”

    我有一个像这样的sql DBSession query Model filter 我想用这个 sql 来解释SQLAlchemy 你想要将 SQLAlchemy 查询编译为字符串 https docs sqlalchemy org faq
  • 反应本机矢量图标显示为问号[重复]

    这个问题在这里已经有答案了 我已经安装了react native v0 46并安装了NativeBase 但在组件中使用标签后 没有显示图标而是显示问号 Android且未在iOS中测试 为了解决这个问题 我做了很多修改 如下所示 rnpm
  • 在 lxml 中定义默认命名空间(无前缀)

    当使用 lxml 渲染 XHTML 时 一切都很好 除非您碰巧使用 Firefox 它似乎无法处理以名称空间为前缀的 XHTML 元素和 javascript 虽然 Opera 能够很好地执行 javascript 这适用于 jQuery