Python:如何将html打印成文件

我正在使用lxml.html来生成一些HTML。 我想漂亮打印(缩进)我的最终结果到一个HTML文件。 我怎么做?

这是我所尝试过的,到现在为止(我对Python和lxml比较陌生):

import lxml.html as lh from lxml.html import builder as E sliderRoot=lh.Element("div", E.CLASS("scroll"), style="overflow-x: hidden; overflow-y: hidden;") scrollContainer=lh.Element("div", E.CLASS("scrollContainer"), style="width: 4340px;") sliderRoot.append(scrollContainer) print lh.tostring(sliderRoot, pretty_print = True, method="html") 

正如你所看到的,我正在使用pretty_print=True属性。 我认为这会给缩进的代码,但它并没有真正的帮助。 这是输出:

<div style="overflow-x: hidden; overflow-y: hidden;" class="scroll"><div style="width: 4340px;" class="scrollContainer"></div></div>

我最终直接使用了BeautifulSoup 。 这是lxml.html.soupparser用于parsingHTML的东西。

BeautifulSoup有一个美化的方法,就是它所做的。 它用适当的缩进和一切来美化HTML。

BeautifulSoup不会修复的HTML,所以破碎的代码,保持破碎。 但是在这种情况下,由于代码是由lxml生成的,所以HTML代码应该至less在语义上是正确的。

在我的问题给出的例子中,我将不得不这样做:

 from BeautifulSoup import BeautifulSoup as bs root=lh.tostring(sliderRoot) #convert the generated HTML to a string soup=bs(root) #make BeautifulSoup prettyHTML=soup.prettify() #prettify the html 

虽然现在我的答案可能不会有帮助,但我现在把它放在这里作为未来别人的参考。

实际上, lxml.html.tostring()并不能很好地打印提供的HTML,尽pipepretty_print=True

然而, lxml.htmllxml.etree的“兄弟姐妹”运行良好。

所以可以使用如下:

 from lxml import etree, html document_root = html.fromstring("<html><body><h1>hello world</h1></body></html>") print(etree.tostring(document_root, encoding='unicode', pretty_print=True)) 

输出是这样的:

 <html> <body> <h1>hello world</h1> </body> </html> 

你不能只是pipe它到HTML Tidy ? 从shell或通过os.system()

在这种情况下, lxml使用libxml2将树序列化为一个string。 以下是决定是否在closures标签后追加换行符的相关代码片段:

  xmlOutputBufferWriteString(buf, ">"); if ((format) && (!info->isinline) && (cur->next != NULL)) { if ((cur->next->type != HTML_TEXT_NODE) && (cur->next->type != HTML_ENTITY_REF_NODE) && (cur->parent != NULL) && (cur->parent->name != NULL) && (cur->parent->name[0] != 'p')) /* p, pre, param */ xmlOutputBufferWriteString(buf, "\n"); } return; 

所以如果一个节点是一个元素,不是内联标签,并且是一个兄弟节点cur->next != NULL ),并且不是p, pre, param之一p, pre, param那么它将输出一个换行符。

如果你不关心古怪的HTML(例如,你必须支持绝对支持Netscpae 2.0使用的客户端,所以拥有而不是<br />是必须的),你总是可以改变你的方法为“XML “,这似乎工作。 这可能是lxml或libxml中的一个错误,但我找不到原因。

不是真的我的代码,我选了它的地方

 def indent(elem, level=0): i = '\n' + level * ' ' if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + ' ' if not elem.tail or not elem.tail.strip(): elem.tail = i for elem in elem: indent(elem, level+1) if not elem.tail or not elem.tail.strip(): elem.tail = i else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = i 

我用它:

 indent(page) tostring(page) 

如果将HTML存储为未格式化的string,则在variableshtml_string ,可以使用beautifulsoup4来完成,如下所示:

 from bs4 import BeautifulSoup print(BeautifulSoup(html_string, 'html.parser').prettify())