1

我正在进行数据迁移,我正在解析 html 并将其导出为 xml。当然,当 html 进入 xml 时,它会被转义,但为了验证解析是否正确,我正在解码括号以在 xml 中获取可读的 html 标签。但是,这些标签都是一起运行的,它仍然不是很可读。

有什么东西可以简单地缩进我拥有的标签结构吗?它既不是有效的 xml 也不是 html。我试过xmllint --formatand xmllint --htmlout,但两者都在不同的地方窒息。

我可以避免手动执行此操作吗?

这是一个小例子:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<result><node><title>This would be the title</title><uri>/path/filename.jpg</uri><alt>Alt tag data</alt><body><p>Some text goes here.</body></node></result>

在实际数据中,里面的 html 标签<body>都转义为&lt;and &gt;,但这太难用肉眼看解析是否正确。因此,我通过查找和替换将它们更改为等效的括号。但是它们仍然没有缩进,因此很难阅读。

两者都tidy抱怨xmllint缺少结束<p>标签。在此数据中,有许多缺失或不匹配的标签。我知道这不是有效的 html 或 xml,但是我们稍后会清理 html,此时我只需要确保在正确的位置解析 html,这很难看到没有换行符或缩进。

为了修复上面的例子,我可以手动删除或关闭<p>标签,但在实际数据中,有很多破损,修复标签只是为了让它解析格式化是一项不平凡的任务。在这个阶段,我试图避免手动按摩并以自动化的方式做事。

例如,对于这一个文件,tidy 报告了 65 个警告和 778 个错误。手动修复它们会浪费时间——我还不如开始自己缩进。我需要一些可以以非严格方式缩进的东西,并且不会关心不匹配的标签。

4

3 回答 3

1

你应该尝试

$ tidy -h
tidy [option...] [file...] [option...] [file...]
Utility to clean up and pretty print HTML/XHTML/XML

http://tidy.sourceforge.net/

编辑

您的问题只是<p>标签,您应该删除它:

$ xmllint --format file.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<result>
  <node>
    <title>This would be the title</title>
    <uri>/path/filename.jpg</uri>
    <alt>Alt tag data</alt>
    <body>Some text goes here.</body>
  </node>
</result>

没有错误。

编辑 2

我的想法是使用一个工具html2text来提供没有 html 标签的 xml,也许你可以将 HTML 文件的缩进存储在 XML CTAGS 中

于 2013-02-25T19:11:19.180 回答
1

我使用了用户Josh Leitzel在此处发布的格式化功能。不完美,但足够好。

于 2013-02-25T20:29:38.267 回答
1

我最近也遇到了这个问题,并使用BeautifulSoup (v4 +) 在 Python (3) 中编写了自己的问题,并通过以下方式对长行进行了一些额外的包装textwrap.wrap()

   import sys
   from bs4 import BeautifulSoup
   from textwrap import wrap

   path = f'{sys.argv[1]}'

   with open(path) as fp:
       for line in wrap(BeautifulSoup(fp).prettify(), replace_whitespace=False):
           print(line)

BeutifySoup 在混杂地解释你扔给它的大多数基于标签的垃圾方面做得很好。但是,此解决方案没有缩进标签。

于 2017-09-05T08:20:04.020 回答