HTMLストリーム/ファイルの一部が不正な形式である、つまりタグが閉じられていないなどの可能性があると仮定して、HTMLストリーム/ファイルを簡単に(可能な限り)解析/反復/操作するために使用できるac / cpp libの推奨事項はありますか.
4 に答える
LibxmlのHTMLparserは使いやすく (以下の簡単なチュートリアル)、不正な形式の HTML でもうまく機能します。
編集: 元のブログ投稿にアクセスできなくなったため、ここにコンテンツをコピーして貼り付けました。
C で (X)HTML を解析することは、しばしば困難な作業と見なされます。C がパーサーの開発に使用するのに最も簡単な言語ではないことは事実です。幸いなことに、libxml2 のHTMLParserモジュールが役に立ちます。お約束どおり、libxml2 の HTMLParser を使用して (X)HTML を解析する方法を説明する簡単なチュートリアルを次に示します。
まず、パーサー コンテキストを作成する必要があります。パーサーにデータを供給する方法に応じて、それを行うための多くの関数があります。を使用
htmlCreatePushParserCtxt()
します。これは、メモリ バッファーで動作するためです。htmlParserCtxtPtr parser = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL, 0);
次に、そのパーサー コンテキストで多くのオプションを設定できます。
htmlCtxtUseOptions(parser, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
これで、(X)HTML ドキュメントを解析する準備が整いました。
// char * data : buffer containing part of the web page // int len : number of bytes in data // Last argument is 0 if the web page isn't complete, and 1 for the final call. htmlParseChunk(parser, data, len, 0);
すべてのデータをプッシュしたら、
NULL
バッファを1
使用して最後の引数としてその関数を再度呼び出すことができます。これにより、パーサーがすべてを処理したことが保証されます。最後に、解析したデータを取得する方法は? それは思ったより簡単です。作成された XML ツリーをたどるだけです。
void walkTree(xmlNode * a_node) { xmlNode *cur_node = NULL; xmlAttr *cur_attr = NULL; for (cur_node = a_node; cur_node; cur_node = cur_node->next) { // do something with that node information, like... printing the tag's name and attributes printf("Got tag : %s\n", cur_node->name) for (cur_attr = cur_node->properties; cur_attr; cur_attr = cur_attr->next) { printf(" ->; with attribute : %s\n", cur_attr->name); } walkTree(cur_node->children); } } walkTree(xmlDocGetRootElement(parser->myDoc));
以上です!それは十分に単純ではありませんか?そこから、参照されているすべての画像を (
img
タグを見て) 見つけてフェッチするなど、あらゆる種類のことを行うことができます。また、(X)HTML 文書全体をまだ解析していなくても、いつでも XML ツリーをたどることができることを知っておく必要があります。
C で (X)HTML を解析する必要がある場合は、libxml2 の
HTMLParser
. 時間を大幅に節約できます。
私はこの種のものにlibCurl C++しか使用していませんが、かなり優れていて使いやすいことがわかりました。ただし、壊れた HTML にどのように対処するかはわかりません。
SIP を使用してみて、その上で BeautifulSoup を実行すると役立つ場合があります。
詳細については、以下のリンク スレッドを参照してください。OpenFrameworks + Python