用Tinyxml2实习获取html纯文本内容
时间: 2024-03-16 19:42:29 浏览: 13
Tinyxml2是一个轻量级的XML解析库,不能直接处理HTML文档。但可以通过其他的库,如libxml2来处理HTML文档,然后使用Tinyxml2来解析和处理解析后的文本内容。
下面给出一个获取HTML文本内容的示例代码:
```c++
#include <iostream>
#include <fstream>
#include <string>
#include <libxml/HTMLparser.h>
#include "tinyxml2.h"
using namespace std;
using namespace tinyxml2;
void parseHtml(xmlNode *node, XMLDocument& doc);
int main()
{
// 读取HTML文件
string htmlFilePath = "example.html";
ifstream htmlFile(htmlFilePath);
if (!htmlFile.is_open()) {
cout << "Failed to open file: " << htmlFilePath << endl;
return 1;
}
string htmlContent((istreambuf_iterator<char>(htmlFile)), istreambuf_iterator<char>());
htmlFile.close();
// 解析HTML文档
HTMLParserCtxtPtr parserCtxt = htmlCreatePushParserCtxt(NULL, NULL, "", 0, "", XML_CHAR_ENCODING_NONE);
htmlParseChunk(parserCtxt, htmlContent.c_str(), htmlContent.size(), 0);
htmlParseChunk(parserCtxt, "", 0, 1);
xmlDocPtr docPtr = parserCtxt->myDoc;
xmlNode *rootNode = xmlDocGetRootElement(docPtr);
// 使用Tinyxml2解析文本内容
XMLDocument doc;
parseHtml(rootNode, doc);
cout << doc.FirstChildElement("body")->GetText() << endl;
// 释放资源
xmlFreeDoc(docPtr);
htmlFreeParserCtxt(parserCtxt);
xmlCleanupParser();
xmlMemoryDump();
return 0;
}
void parseHtml(xmlNode *node, XMLDocument& doc) {
for (xmlNode *curNode = node; curNode; curNode = curNode->next) {
if (curNode->type == XML_TEXT_NODE) {
doc.InsertEndChild(doc.NewText((const char *)curNode->content));
}
else if (curNode->type == XML_ELEMENT_NODE && strcmp((const char *)curNode->name, "script") != 0) {
XMLElement *newNode = doc.NewElement((const char *)curNode->name);
for (xmlAttr *attr = curNode->properties; attr; attr = attr->next) {
newNode->SetAttribute((const char *)attr->name, (const char *)attr->children->content);
}
parseHtml(curNode->children, newNode->ToDocument());
doc.InsertEndChild(newNode);
}
}
}
```
该示例代码将HTML文档解析为一个DOM树,然后使用递归的方式将文本内容提取出来,并使用Tinyxml2构建新的XML文档。其中,在解析HTML文档时,排除了`<script>`标签,因为`<script>`标签中的内容不应该被解析为文本内容。
最终,可以使用`doc.FirstChildElement("body")->GetText()`获取HTML文档中`<body>`标签中的纯文本内容。