9

Python 库lxml似乎提供了几个生成 HTML 文档的构建器。这些有什么区别?

但是这些会生成纯 HTML,而不是 XHTML。虽然我可以手动添加 xmlns 声明,但这并不优雅。那么使用 lxml生成X HTML 文档的推荐方法是什么?

lxml.builder.E

来自http://lxml.de/tutorial.html#the-e-factory的示例:

>>> from lxml.builder import E

>>> def CLASS(*args): # class is a reserved word in Python
...     return {"class":' '.join(args)}

>>> html = page = (
...   E.html(       # create an Element called "html"
...     E.head(
...       E.title("This is a sample document")
...     ),
...     E.body(
...       E.h1("Hello!", CLASS("title")),
...       E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
...       E.p("This is another paragraph, with a", "\n      ",
...         E.a("link", href="http://www.python.org"), "."),
...       E.p("Here are some reserved characters: <spam&egg>."),
...       etree.XML("<p>And finally an embedded XHTML fragment.</p>"),
...     )
...   )
... )

lxml.html.builder

来自http://lxml.de/lxmlhtml.html#creating-html-with-the-e-factory的示例:

>>> from lxml.html import builder as E
>>> from lxml.html import usedoctest
>>> html = E.HTML(
...   E.HEAD(
...     E.LINK(rel="stylesheet", href="great.css", type="text/css"),
...     E.TITLE("Best Page Ever")
...   ),
...   E.BODY(
...     E.H1(E.CLASS("heading"), "Top News"),
...     E.P("World News only on this page", style="font-size: 200%"),
...     "Ah, and here's some more text, by the way.",
...     lxml.html.fromstring("<p>... and this is a parsed fragment ...</p>")
...   )
... )
4

3 回答 3

2

混合来自 lxml.builder 的 ElementMaker 和 E 对我有用:

from lxml import etree
from lxml.builder import ElementMaker,E

M=ElementMaker(namespace=None,
               nsmap={None: "http://www.w3.org/1999/xhtml"})
html = M.html(E.head(E.title("Test page")),
              E.body(E.p("Hello world")))
result = etree.tostring(html,
                        xml_declaration=True,
                        doctype='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
                        encoding='utf-8',
                        standalone=False,
                        with_tail=False,
                        method='xml',
                        pretty_print=True)
print result

结果是

<?xml version='1.0' encoding='utf-8' standalone='no'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Test page</title>
  </head>
  <body>
    <p>Hello world</p>
  </body>
</html>
于 2015-09-16T05:15:23.337 回答
1

Python 库 lxml 似乎提供了几个生成 HTML 文档的构建器。这些有什么区别?

lxml.builder.E 使用工厂模式

从 lxml.html 导入生成器为 E
 从 lxml.html 导入 usedoctest
 html = E.HTML(
   E.头(
     E.LINK(rel="stylesheet", href="great.css", type="text/css"),
     E.TITLE("有史以来最好的页面")
   ),
   E.身体(
     E.H1(E.CLASS("标题"), "头条新闻"),
     EP("World News only on this page", style="font-size: 200%"),
     “啊,顺便说一下,这里还有一些文字。”,
     lxml.html.fromstring("

...这是一个解析的片段...

") )

lxml.builder 使用原型模式:

从 lxml.builder 导入 E

 def CLASS(*args): # class 是 Python 中的保留字
     返回 {"class":' '.join(args)}

 html = 页面 = (
   E.html(# 创建一个名为“html”的元素
     E.头(
       E.title("这是一个示例文档")
     ),
     E.体(
       E.h1("你好!", CLASS("title")),
       Ep("这是一个带有 ", Eb("bold"), " 文本的段落!"),
       Ep("这是另一个段落,有一个", "\n",
         Ea("链接", href="http://www.python.org"), "."),
       Ep("这里有一些保留字符:."),
       etree.XML("

最后是嵌入的 XHTML 片段。

"), ) ) )

虽然我可以手动添加 xmlns 声明,但这并不优雅。

XSLT 将是另一种选择。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="no" doctype-system="about:legacy-compat" />
<xsl:template match="/">
  <html xmlns="http://www.w3.org/1999/xhtml">
    <xsl:copy-of select="."/>
  </html>
</xsl:template>
</xsl:stylesheet>

参考

于 2014-05-29T05:35:27.770 回答
0

Python 库 lxml 似乎提供了几个生成 HTML 文档的构建器。这些有什么区别?

lxml.builder.E 提供了一个带有类的 XML 文档,<class 'lxml.etree._Element'>这意味着该对象不知道如何处理 html 文档(可能不是)。

lxml.html.builder 给出 a<class 'lxml.html.HtmlElement'>这意味着您有一个知道它是 html 的对象,并提供专用于 HTML 的方法和属性e.bodye.make_links_absolute()例如https://lxml.de/api/lxml.html.HtmlMixin-class.html

于 2020-02-23T17:26:28.160 回答