Borland C++Builderで使えるHTMLパーサーのVCLを探しています。海外では、THTMLParserなどを検索語にして調べると幾つかありましたが日本語が文字化けしたりして、調子よくありません。

http://www.dallas.net/~richardp/delphi/component …

日本語の通るフリーのHTMLパーサーのVCLというのはご存知でしょうか。

また、実際にやりたいのは、ページから、

・<TITLE>タグで囲まれたタイトルの抽出
・<A HREF = URL>リンク文字列</A>
 の、URL部分とリンク文字列のリストを得る

ということなのですが、私の拙い知識では何度やってもうまく取り出すことができません。それでVCLでできないかなあと調子の良いことを考えています。こういった文字列解析の定石のようなコーディングはあるのでしょうか。

質問ばかりですみません。ご存知の方よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

私も似たようなものを探していました。


VCLではありませんが、ANSI C++/ライブラリで書かれているHTMLパーサライブラリがデジリニアのページで公開されているのでご参考にされてはいかがでしょう。
私もダウンロードしただけでまだ試していないため何ができるのかまでは把握しておりません。すいません(^_^;

URLのページのダウンロードのところにあります。

参考URL:http://www.midl.co.jp/
    • good
    • 0
この回答へのお礼

ご紹介ありがとうございました。
それからいろいろ苦労しましたが結局、パーサを自作して目的を遂げました。CppWebBrowserにQueryInterfaceしてiHTMLDocument2オブジェクトからソースを取り出すという方法もその後見つけました。しかし、BCBでCOM操作は複雑になりがちでまだ勉強中です。

お礼日時:2001/07/23 16:48

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q<>で囲まれた文字列を文字列のなかから取り出す方法

現在、C++を使って、文字列の中から<>で囲まれた部分を抜き出して表示する、というプログラムを書きたいんですが、どうもうまくいきません。例として、

int main(void)
{
char html[] = "<abdc><kihddds><mokus>";
char *p;
int c;
c = '<';
p = strchr(html, c);
printf("%cは文字列の%d番目にあります。\n", c, p-html+1);
}

のような感じで最初の<と最初の>の場所を探すのはできるのですが、2個目以降を同じようにさがすことができません・・・。

上記の例でいうと、実行結果として
abdc
kihddds
mokus
とでるようなものをつくりたいのです。
良い方法がありましたら、どうぞご教授おねがいしますm(__)m

Aベストアンサー

こんな感じかな、と。(確認はしていません)


char *pstart;
char *pend;

pstart=strchr(html,'<');
if(pstart!=0)
pend=strchr(pstart+1,'>');
while(pstart!=0 && pend!=0){
printf(省略);
pstart=strchr(pend+1,'<');
if(pstart!=0)
pend=strchr(pstart+1,'>');
}

Qgetche() → getc() = segmentation fault

WindowsのVC++からUNIXのgccに移行している最中です。
VC++では下記のようにgetche()を使っていたんですが

printf("Enter more data (Y/N) => ");
ch = toupper(getche());

index++;
if(ch != 'Y')
repeat = FALSE;

UNIXではconio.hとgetche()がないとのことで
cursh.hとgetc()を使うことにしました。

printf("Enter more data (Y/N) => ");
ch = toupper(getc(stdin));
putchar(ch);

index++;
if(ch != 'Y')
repeat = FALSE;
}
if((file_ptr = fopen("C:FLIGHTS.DTA","w")) == NULL)
{
printf("Can't open filights file.");
exit(0);
}
fwrite(flights_array, sizeof(flights_array), index, file_ptr);
fclose(file_ptr);
最初の入力は良いのですが'y'と打ってからの入力が
一つ飛ばされてしまいます。
(まるでscanfでfflush(stdin)を付け忘れたかのように)

Flight ID => NW123
Preminum Capacity => 12
Available Preminum Seats => 12
Economy Capacity => 120
Available Economy Seats => 120
Enter more data (Y/N) => y
Y
Flight ID => Preminum Capacity => 6 //←Flight IDの入力が飛ばされてます…
Available Preminum Seats => 6
Economy Capacity => 45
Available Economy Seats => 45
Enter more data (Y/N) => n
Segmentation fault

そして挙句の果てにSegmentation faultが出て止まってしまいます。
VC++ → gccの移行は初めてなのでどうしていいのか分かりません。
どなたか良い解決方法をご存知の方、助けてください。お願いします。

WindowsのVC++からUNIXのgccに移行している最中です。
VC++では下記のようにgetche()を使っていたんですが

printf("Enter more data (Y/N) => ");
ch = toupper(getche());

index++;
if(ch != 'Y')
repeat = FALSE;

UNIXではconio.hとgetche()がないとのことで
cursh.hとgetc()を使うことにしました。

printf("Enter more data (Y/N) => ");
ch = toupper(getc(stdin));
putchar(ch);

index++;
if(ch != 'Y')
repeat = FALSE;
}
if((file_ptr = fopen("C:FLIGHTS.DTA","w")) == NULL)
...続きを読む

Aベストアンサー

stdinのバッファリングはsetbuf()で無効化できます。
問題はそっちよりもコンソールプログラム(ターミナルなど)のバッファリングですね。
sttyコマンドでターミナルをrawモードにしてください。

QC++での とusingnamespaceの関係等を教えてください。

どうでもいい質問なのですが…

C++で色々とソースを打っていると気づいたのです。
#include <iostream.h>とするとusing namespace std;の一文を書かなくてもコンパイルエラーになりません。
また、逆に#include <iostream>とするとusing namespace std;の一文が必要になります。

だから、h(ヘッダファイル)の.hは必要なのかな?と思い、#include <cstdlib.h>とするとコンパイルエラーになります。

なにか理屈がわかりません。コンパイラはVC++6.0です。よろしくご回答の方お願いいたします。

Aベストアンサー

完全な法則、理屈があるというよりも、歴史的経緯によるものです。

<iostream.h>は、namespace stdがまだ決まってなかった頃の名残、「古いヘッダ」です。
VC6は言語仕様が正式に固まるより古い代物なので、
<iostream.h>という過渡期の遺物がついてます。
この頃は、namespace stdがまだなかったので、
<iostream.h>内の関数はusingしなくても使えます。

但し、今の言語仕様ではnamespace stdが導入されてますので、
あくまで互換性のためのものと思います。
新規に書くなら<iostream>を使うべきです。

一方、<iostream>の方は現行言語仕様通りのヘッダです。
こちらは、namespace std内の定義に正しくなっているため、
namespaceを指定して使う必要があります。

 using namespace std;や、using std::cout;の他、
 std::cout << "foo";などもできますので、
 必ずしもusing directiveやusing declarationが必要とは限りませんが。
 少なくとも、ヘッダなどで *むやみに* usingはnamespaceの意義を損ない好ましくないと思います(使い方次第)。

> h(ヘッダファイル)の.hは必要なのかな?と思い、

ちなみに、C++としては、単にヘッダであり、ファイルとは限りません。

> #include <cstdlib.h>とするとコンパイルエラーになります。

「c…」なヘッダには原則、対応するC言語のヘッダがあります。
「c…」というヘッダは、そのC言語のヘッダのC++版であり、
もし<cstdlib.h>に相当するものがあるとすれば、それは単に<stdlib.h>です。
C言語にはnamespaceがありませんので、<stdlib.hにもnamespace stdはありません。

<iostream>はC言語にはない、C++独自のヘッダであり、
<cstdlib>はC言語の<stdlib.h>のC++版なので、そのような挙動の違いになります。
<cstdio>と<stdio.h>とか、<cstring>と<string.h>とか、
もともと対応するC言語のヘッダがあるものは「c…」という名前になってます。

完全な法則、理屈があるというよりも、歴史的経緯によるものです。

<iostream.h>は、namespace stdがまだ決まってなかった頃の名残、「古いヘッダ」です。
VC6は言語仕様が正式に固まるより古い代物なので、
<iostream.h>という過渡期の遺物がついてます。
この頃は、namespace stdがまだなかったので、
<iostream.h>内の関数はusingしなくても使えます。

但し、今の言語仕様ではnamespace stdが導入されてますので、
あくまで互換性のためのものと思います。
新規に書くなら<iostream>を使うべきです...続きを読む

QC言語のプログラムで#includeを使わず#includeだけで

C言語のプログラムで#include<math.h>を使わず#include<stdio.h>だけで√(sqrt)を表現することは可能でしょうか?

Aベストアンサー

ご自分で sqrt 関数を作れば可能です。
こんな感じでしょうか。

#include <stdio.h>

static double
sqrt (double s)
{
 double x = s / 2.0;
 double last_x = 0.0;

 while (x != last_x)
 {
  last_x = x;
  x = (x + s / x) / 2.0;
 }

 return (x);
}

int
main (int argc, char * argv[])
{
 printf ("sqrt (%f) = %f\n", 3.0, sqrt (3.0));
}

Q<正規表現>直書きしない文字列否定

Objective-Cの正規表現について質問です。
表計算ソフトなどで使う数式を検索対象文字列として、「引数内に関数が使用されていない関数」をマッチさせたいと考えています。
どの様な正規表現であれば良いかご教示頂けますでしょうか。

以下に具体例を示します。
--------------------------------------------
■検索対象文字列
=SUM(A1:A3;SUM(B1:B3);ROUND(IF(C2>10;1.234;0);2))
※数式の内容は適当です

■マッチさせたい文字列
SUM(B1:B3)
IF(C2>10;1.234;0)

■補足説明
1) 検索対象文字列の最初のSUM関数の引数内には別のSUM関数等が使用されているので除外。
2) 2番目のSUM関数の引数内には関数が使用されていないのでマッチさせる。
3) ROUND関数の引数内にはIF関数が使用されているので除外。
4) IF関数の引数内には関数が使用されていないのでマッチさせる。

■その他条件
1) 関数名は2~5文字の英字とする
 例.SUM(),IF(),ROUND()など
2) 正規表現内で関数名の直書きはしない
3) セル参照式のアルファベットは必ず1文字とする
 例.A1やZ30等。AB1やBZ30等は無い。
--------------------------------------------

関数の引数内に「英字2~5文字がある場合は除外する」と言う意味で、以下の様な正規表現を組んだのですが上手くいきませんでした。
[A-Za-z]{2,5}\([^([A-Za-z]{2,5})]*\)

以下の様に関数名を直書きすれば理想の結果となるのですが…
[A-Za-z]{2,5}\([^(SUM|IF|ROUND)]*\)

あくまで、いろいろな関数名に可変で対応したいと考えています。
どの様な正規表現であれば良いでしょうか。
お知恵を貸して頂ければと思います。
宜しくお願い致します。

Objective-Cの正規表現について質問です。
表計算ソフトなどで使う数式を検索対象文字列として、「引数内に関数が使用されていない関数」をマッチさせたいと考えています。
どの様な正規表現であれば良いかご教示頂けますでしょうか。

以下に具体例を示します。
--------------------------------------------
■検索対象文字列
=SUM(A1:A3;SUM(B1:B3);ROUND(IF(C2>10;1.234;0);2))
※数式の内容は適当です

■マッチさせたい文字列
SUM(B1:B3)
IF(C2>10;1.234;0)

■補足説明
1) 検索対象文字列の最初のSUM関数の引...続きを読む

Aベストアンサー

あ, 念のためですが, 「本来の正規表現では不可能」というのは, 主にかっこの問題です. つまり, 正規表現だと
IF((A1+B3)/(C2+5) > 3; 7; 1)
とかいうばあいに
「IF((A1+B3)」
だけを取り出しちゃったりするんですね.

逆に言えば, 「括弧は関数のためだけにある」というならできるような気がします.


人気Q&Aランキング

おすすめ情報