9

Python ライブラリlxmlは、HTML ドキュメントを生成するための複数のビルダーを提供しているようです。これらの違いは何ですか?

しかし、これらは XHTML ではなくプレーンな HTML を生成します。手動で 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 は factory パターンを使用しています

lxml.html import builder から E として
 from lxml.html import usedoctest
 html = E.HTML(
   E.HEAD(
     E.LINK(rel="stylesheet", href="great.css", type="text/css"),
     E.TITLE("史上最高のページ")
   )、
   E.BODY(
     E.H1(E.CLASS("見出し"), "トップニュース"),
     EP("このページでは世界のニュースのみ", style="font-size: 200%"),
     "ああ、ちなみに、ここにもう少しテキストがあります。",
     lxml.html.fromstring("

...そしてこれは解析されたフラグメントです...

") )

lxml.builder はプロトタイプ パターンを使用しています。

from lxml.builder import E

 def CLASS(*args): # class は Python の予約語です
     return {"class":' '.join(args)}

 html = ページ = (
   E.html( # 「html」という要素を作成
     E.head(
       E.title("これはサンプル文書です")
     )、
     E.body(
       E.h1("こんにちは!", CLASS("タイトル")),
       Ep("これは ", Eb("太字"), " テキストを含む段落です!"),
       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 に答える