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

3

我需要解析现实中的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以及如何解析?

2个回答

2

我猜您需要进行HTML到XML的转换。在Java中,我使用JSoup,但stackoverflow肯定知道如何在C语言中实现它。第一个搜索结果:C++中的HTML到XML转换


0

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>

对于这个有点 hacky 的答案,只需在输入字符串前面添加 <div>,然后从输出字符串中删除 <div></div> 即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接