なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

libxmlでHTMLParserを使う

メイン関数から直接libxmlの関数を呼ぶ最小限のサンプル
「&」とかの実体参照化しなければいけない文字がある場合エラーは出るが、とりあえず最後まで動くはず。

#include <libxml/HTMLparser.h>
#include <iostream>

using namespace std;

void FindInfo(xmlNode*& element);

int main() {
	// HTML用の構造体
	htmlDocPtr m_doc;

	// ファイル名とエンコードの設定
	char* file = "./sample.html";
	char* enc = "utf-8";

	// xmlの読み込み
	if (m_doc = htmlReadFile(file, enc, HTML_PARSE_RECOVER)) {
		htmlNodePtr root = xmlDocGetRootElement(m_doc);
		if (root != NULL) {
			FindInfo(root);
		}
		xmlFreeDoc(m_doc);
		m_doc = NULL;
	}

	xmlCleanupParser();
	xmlCleanupCharEncodingHandlers();
}

void FindInfo(xmlNode*& element) {

	for (htmlNodePtr node = element; node != NULL; node = node->next) {

		if (node->type == XML_ELEMENT_NODE) {
			/** もしノードの中身が「A」タグでattributeに「HREF」が含まれていれば表示 */
			if(xmlStrcasecmp(node->name, (const xmlChar*)"A") == 0){
				for(xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next){
					if(xmlStrcasecmp(attr->name, (const xmlChar*)"HREF") == 0){
						printf((char *)node->children->content, "%s\n");
					}
				}
			}

            // 再帰読み込み
			if(node->children != NULL)
			{
				FindInfo(node->children);
			}
		}
	}
}