如何使用Python向现有HTML添加一致的空白?

如何使用Python向现有HTML添加一致的空白?,python,html,whitespace,html5lib,Python,Html,Whitespace,Html5lib,我刚开始在一个网站上工作,这个网站上有很多网页,所有的HTML都放在一行上,阅读和使用起来都很痛苦。我正在寻找一个工具(最好是Python库),它将接受HTML输入并返回相同的HTML,除了添加换行符和适当的缩进。(所有标记、标记和内容都应保持不变。) 库不必处理格式错误的HTML;我将首先传递HTML,因此它将得到格式良好的HTML。然而,如上所述,我宁愿它不改变任何实际的标记本身;我信任html5lib,宁愿让它处理正确性方面的问题 首先,有人知道仅仅使用html5lib是否可以做到这一点吗

我刚开始在一个网站上工作,这个网站上有很多网页,所有的HTML都放在一行上,阅读和使用起来都很痛苦。我正在寻找一个工具(最好是Python库),它将接受HTML输入并返回相同的HTML,除了添加换行符和适当的缩进。(所有标记、标记和内容都应保持不变。)

库不必处理格式错误的HTML;我将首先传递HTML,因此它将得到格式良好的HTML。然而,如上所述,我宁愿它不改变任何实际的标记本身;我信任html5lib,宁愿让它处理正确性方面的问题


首先,有人知道仅仅使用html5lib是否可以做到这一点吗?(不幸的是,他们的文档似乎有点稀疏。)如果没有,您建议使用什么工具?我见过一些人推荐HTMLTidy,但我不确定它是否可以配置为只更改空白。(如果从格式良好的HTML开始传递,它除了插入空格之外还能做什么?

如果HTML确实是格式良好的xml,您可以使用DOM解析器

from xml.dom.minidom import parse, parseString

#if you have html string in a variable
html = parseString(theHtmlString)

#or parse the html file
html = parse(htmlFileName)

print html.toprettyxml()
该方法允许指定缩进、新行字符和输出的编码。您可能还需要检查该方法。

算法
  • 将html解析为某种表示形式
  • 将表示序列化回html
  • 例子
    #/usr/bin/env python
    从html5lib导入HTMLPasser、treebuilders
    parser=HTMLParser(tree=treebuilders.getTreeBuilder(“beautifulsoup”))
    c=“”头衔……”
    soup=parser.parse(c)
    打印汤。美化
    
    输出:

    <html>
     <head>
      <title>
       Title
      </title>
     </head>
     <body>
      ......
     </body>
    </html>
    
    
    标题
    ......
    
    我选择J.F.Sebastian的答案,因为我认为这是最简单的,因此也是最好的,但我为那些不想安装Beauty Soup的人添加了另一个解决方案。(同样,美丽的汤树建设者也将成为。)这个解决方案要感谢Amarghosh的提示;我只是把它充实了一点。查看html5lib,我意识到它将以本机方式输出一个minidom对象,这意味着我可以使用他的建议
    toprettyxml()
    。以下是我的想法:

    from html5lib import HTMLParser, treebuilders
    from cStringIO import StringIO
    
    def tidy_html(text):
      """Returns a well-formatted version of input HTML."""
    
      p = HTMLParser(tree=treebuilders.getTreeBuilder("dom"))
      dom_tree = p.parseFragment(text)
    
      # using cStringIO for fast string concatenation
      pretty_HTML = StringIO()
    
      node = dom_tree.firstChild
      while node:
        node_contents = node.toprettyxml(indent='  ')
        pretty_HTML.write(node_contents)
        node = node.nextSibling
    
      output = pretty_HTML.getvalue()
      pretty_HTML.close()
      return output
    
    举个例子:

    >>> text = """<b><i>bold, italic</b></i><div>a div</div>"""
    >>> tidy_html(text)
    <b>
      <i>
        bold, italic
      </i>
    </b>
    <div>
      a div
    </div>
    
    >text=“”粗体,斜体div”“”
    >>>tidy_html(文本)
    粗体,斜体
    潜水艇
    

    为什么我要迭代树的子级,而不是直接调用
    dom\u树上的
    toprettyxml()
    ?我正在处理的一些HTML实际上是HTML片段,因此它缺少
    标记。为了处理这个问题,我使用了
    parseFragment()
    方法,这意味着我会得到一个DocumentFragment作为回报(而不是一个文档)。不幸的是,它没有一个
    writexml()
    方法(它调用
    toprettyxml()
    ),所以我迭代子节点,子节点确实有这个方法。

    。。。哇,那个文档太糟糕了…是的,除了介绍页面,阅读代码似乎是唯一的选择…如果我擅长编写文档,我会自愿。好吧,我可能还是自愿的,因为我很确定只要有更多就会有进步。多亏了你,在看到J.F.塞巴斯蒂安的更好的例子之前,我想出了一个非常可行的解决方案。(我提交它作为另一个答案,只是为了让其他不想安装Beautiful Soup的人有另一个选择。)感谢您的指导!
    >>> text = """<b><i>bold, italic</b></i><div>a div</div>"""
    >>> tidy_html(text)
    <b>
      <i>
        bold, italic
      </i>
    </b>
    <div>
      a div
    </div>