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.html
– lxml.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())