繁体   English   中英

C/C++、libxml2:解析 HTML 片段

[英]C/C++, libxml2: parsing HTML fragments

我需要解析现实生活中的 HTML 文档。 在大多数情况下,它们是结构良好的,但有时(并且不能忽略)它们显示为在根级别具有多个同级的片段。
例子:

<div>one</div>
<div>two</div>

现在我使用带有以下解析标志的 libxml2 v2.7.8:

HTML_PARSE_NOERROR | HTML_PARSE_RECOVER | HTML_PARSE_NODEFDTD | HTML_PARSE_NOIMPLIED

如果我用上面的例子提供它,然后从解析的文档中转储 HTML:

<div>one<div>two</div></div>

正如您所看到的,它嵌套了元素,而我的要求是不破坏 HTML。 此外,我希望能够在从这些片段创建的树上运行 XPath 表达式。 在这种情况下,要访问第二个 DIV,将使用“/div[2]”。

所以问题是是否可以解析这些类型的 HTML 以及如何解析?

我猜你需要 html 到 xml 的转换。 在 Java 中我使用 JSoup,但是 stackoverflow 肯定知道如何在 c 中做到这一点。 第一次命中: 使用 C++ 将 HTML 转换为 XML

Libxml2 由 PHP 的 DOM 组件使用。 在 PHP 中工作,我找到了以下解决方法:

<?php
echo DOMDocument::loadHTML("<b>Bold</b> <i>Italic</i>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD)->saveHTML();
echo DOMDocument::loadHTML("<div><b>Bold</b> <i>Italic</i>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD)->saveHTML();

输出:

<b>Bold<i>Italic</i></b>
<div><b>Bold</b> <i>Italic</i></div>

因此,对于不可否认的有点老套的答案,只需将<div>前置到您的输入字符串,然后从输出字符串中删除<div></div>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM