質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

C++ HTMLタグ取り出して分を表示

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,253

J.Spei

score 10

HTMLページの<p><p></p></p>で囲まれた文章をC++で表示したいのですが、うまくいきません。
なにか良い方法はありませんか??
現在こんな感じのプログラムでやってます


include <libxml/HTMLparser.h>

include <iostream>

include <string>

include <fstream>

include <stdio.h>

include <string.h>

include <stdlib.h>

using namespace std;

void FindInfo(xmlNode*& element);

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

    // ファイル名とエンコードの設定
    char* file = "http://www.visit-hokkaido.jp/article/detail/2";
    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();
    return;
}

//地域
void FindInfo(xmlNode*& element){
    char* count;
    for (htmlNodePtr node = element; node != NULL; node = node->next){
            //<p><p>
            count = (char *)node->next->next->children->content;
            string a = count;
            printf("%s\n",count);
            if(xmlStrcasecmp(node->name, (const xmlChar*)"p") == 0){
                for(xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next){
                    if(xmlStrcasecmp(node->name, (const xmlChar*)"p") == 0){
                        count = (char *)node->next->next->children->content;
                        string a = count;
                        printf("%s\n",count);
                    }
                }
            }

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


<!-- /inner-->
 <div class="inner">
  <!--/article_blocks-->

    <!---->
    <section class="artblock_left cf">
    <img class="ph" src="http://www.visit-hokkaido.jp/assets/images/feature/2015/12/2_block_image_1.jpg?1450698010" alt="" />
<p class="artblock_catch">都市と自然が融合した北海道の中心地</p>
<p><p>北海道の政治・経済・文化の中心地である札幌は、便利な都市機能と豊かな自然が調和している街です。国の重要文化財に指定されている「札幌市時計台」や、都市景観100選にも選ばれる「大通公園」をはじめとした観光名所も豊富で、「さっぽろ雪まつり」や「サッポロ・シティ・ジャズ」など、季節ごとのイベントもバラエティ豊か。中心部は碁盤の目状になっており、初めての人でも街歩きがしやすいのも大きな魅力です。</p></p>
    </section>

     <!---->
   <div class="artblock_free"></div>
  <!--article_blocks/-->
 </div>
<!--inner/-->

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • raccy

    2016/01/23 10:13

    関数名から察するにlibxml2を使用していると思いますが、あってますでしょうか?C++には言語標準でXMLのライブラリは存在しませんし、有用なXMLのライブラリも複数存在します。どのライブラリを使っているかを明記していただくと、回答者も回答しすくなると思います。

    キャンセル

  • J.Spei

    2016/01/23 12:32

    libxml2を使用しています。あとhtmlparserですね

    キャンセル

回答 2

0

visual c++ 前提ですが、xmlreader 使えば良いのでは?
もしかして、xml ファイルを読み込んで、平文からp タグ囲みを検索したいってことですか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/22 17:37

    OSはLinuxのubuntuです。
    アロー演算子の問題なのか2つのpで囲まれたところが取り出せないんです

    キャンセル

  • 2016/01/22 18:01

    html の構造解析せず、単純にpタグ2つ連続してる部分を抜き出すだけなんですよね?
    何が難しくて悩んでいるのかが解らないのですが。
    html を1行ずつ読み込み、ぎょうまつの改行コードを除去して全部つなげる。
    1行のもじれつから、"<p><p>" を検索、この位置から直近の閉じタグを検索、範囲を切り取る。
    なにか特徴的なキーワードがあって、そのキーワードがある直後の pタグだとしても、結局特定ワードで見つけることに代わり無いので、何が難しいのかわかりません。

    キャンセル

  • 2016/01/23 12:30

    回答ありがとうございます。そのやり方を知らなかったです。
    勉強不足でした。やってみます!

    キャンセル

0

ipadcaronさんの言うように、普通に文字列(string)として読み込んで,str.find("<P><p>");とかで見つければいいと思いますが?
[追記]

~/test/cpptst >cat tst01.cpp 

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

bool strip(const string &ss);

int main()
{
    string sbuf;
    string stmp;

    ifstream inFile("./tst01.xml");
    // ファイルから文字列を全て読む
    while( getline(inFile,stmp)){
        sbuf += stmp;
    }
    //
    if( !sbuf.empty()){
        (void)strip(sbuf);
    }
    //
    return 0;
}

bool strip(const string &ss)
{
    string::size_type sp= 0;
    string::size_type ep= 0;
    //
    sp= ss.find("<p><p>");
    if( sp == string::npos ){
        // 見つからなかった;;
        return false;
    }
    sp += 6;    // "<p><p>"をスキップ
    ep= ss.find("</p></p>",sp);
    //
    if( ep != string::npos ){
        // 終わりが見つかったら表示
        cout << ss.substr(sp, ep-sp) << endl;
        return true;
    }
    //
    return false;
}
~/test/cpptst >

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/23 08:20 編集

    xmlは普通のテキストファイルです。それが分かればxml固有の処理をしないで単純にテキストファイルの文字列検索をすればいいと思います。
    ちょっとやってみたので結果だけ
    ~/test/cpptst >c++ tst01.cpp
    ~/test/cpptst >./a.out
    北海道の政治・経済・文化の中心地である札幌は、便利な都市機能と豊かな自然が調和している街です。国の重要文化財に指定されている「札幌市時計台」や、都市景観100選にも選ばれる「大通公園」をはじめと
    した観光名所も豊富で、「さっぽろ雪まつり」や「サッポロ・シティ・ジャズ」など、季節ごとのイベントもバラエティ豊か。中心部は碁盤の目状になっており、初めての人でも街歩きがしやすいのも大きな魅力です。
    ~/test/cpptst >

    ファイルから文字列を全て読み込んで、sp= find("<p><p>");で最初を見つけて、find("</p></p>",sp);で終わりを見つけてsubstr()で表示しているだけです。
    エラーチェックをしなければmain()も含めて20行ほどのプログラムです。

    キャンセル

  • 2016/01/23 12:30

    回答ありがとうございます。

    是非ソースコード見せてもらえませんか?

    キャンセル

  • 2016/01/23 17:04

    エンコードはUTF-8ですがtst01.xmlは、ご提示の<!-- /inner-->~<!--inner/-->をそのまま使っています。あと、xmlとして表示させると<p>と<p>あるいは、</p>と</p>の間に改行が入るようです・・・私の環境だけかもしれませんが悪さをしていなければいいのですが。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる