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と関連する良く見られている質問

Qmx.k.vodafone.ne.jpとは?

タイトルのアドレスは、自分の携帯端末のホスト名なのでしょうか?

ご回答願います。

Aベストアンサー

>機種によってホスト名が違うのでしょうか???
自分自身のホスト名はそれぞれの機種によって命名規則があります。
TCP/IPに参加しているホストでしたら端末毎にホスト名はことなるでしょうし、スマホや携帯電話であれば必要に応じてキャリアのゲートウェイを使っているでしょう。


mx.k.vodafone.ne.jpというのはボーダフォンのメールサーバのようで、これが機種によりメールの送信先サーバが異なるということではありません。

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,'>');
}

QJPとは何のことでしょうか。

製薬関連の日本文に、
薬事法とともに、JP(JP法かもしれません)という略語が出ています。
このJPを調べましたが、検索では、URLの一部が引っかかるのみで、特定できません。

詳しい方教えてください。前後の文脈から、団体、法令などの短縮だと思います。日本のJapanではないと思います。

Aベストアンサー

製薬関連の文ということですから、

JP は Japanese Pharmacopoeia (日本薬局方)の略だと思います。


日本薬局方は、医薬品に関する公定書。医薬品の名称などの他に試験法や純度の基準、剤形などが記されており、治験関連の翻訳でもよく登場します。

Japanese Pharmacopoeia Fourteenth Edition (JP14)
第十四改正、日本薬局方追補

など。

これは国ごとに制定され、今は5年に一度改定されるようですね。

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モードにしてください。

Q@nethomeのx-x-x-x.rev.home.ne.jpとは?

現在、@Nethomeと契約をしてインターネットをしているのですが、
少し不思議に思ったことがあるのですが、

割り当てられたグローバルIPアドレスがxxx.xxx.xxx.xxx
だとして、
xxx-xxx-xxx-xxx.rev.home.ne.jpというドメイン名が割り当てられますよね、他のプロバイダと契約をした場合も、このようなドメイン名は割り当てられるのですか?またこのドメイン名とno-ip.comなど取得できるドメイン名の違いはなんでしょう?(サブドメインに自分で好きな名前をつけられるという点を除いて)

またルータを使う際に申請して取得するドメインがありますよね、
このドメインは実際にインターネット上で他のパソコンからアクセスするのに利用出来るものではないようですが、単に、

ルータ起動→

@NetHomeのDHCPサーバ(ルータ用ドメインとルータ名を見て、ルータ使用を申請してあるかを確認して、IPアドレスを割り当てる)

→割り当てられたIPアドレスをルータに設定→

インターネットが出来る


のように使う、ドメインはドメインだけど、一般的なドメインというより、登録IDのようなものなのでしょうか?

ついでに、このドメインがルータ内のPCのDnsサフィックスに自動で登録される設定になっているようですが、登録IDの用途でしか使用しないようなアクセスできないドメインを、PCのDNSサフィックスに登録する意味ってなんでしょう?

よろしくお願いします。

現在、@Nethomeと契約をしてインターネットをしているのですが、
少し不思議に思ったことがあるのですが、

割り当てられたグローバルIPアドレスがxxx.xxx.xxx.xxx
だとして、
xxx-xxx-xxx-xxx.rev.home.ne.jpというドメイン名が割り当てられますよね、他のプロバイダと契約をした場合も、このようなドメイン名は割り当てられるのですか?またこのドメイン名とno-ip.comなど取得できるドメイン名の違いはなんでしょう?(サブドメインに自分で好きな名前をつけられるという点を除いて)

またルータを使...続きを読む

Aベストアンサー

>ところでどこのプロバイダでもこのようにFQDNは割り当てられているのでしょうか?
固定でないグローバルアドレスを割り当てる通常のサービスではほぼすべてあたえられています。
>DHCPでIPアドレスを割り当てると同時にDDNSに登録を行っているのは推測できるのです
プロバイダ自社ユーザーのFQDNであってDDNSではありません。
DNSの考え方は同様かもしれませんが、DDNSのサービスはホスト名については
ユーザーが任意に登録することが可能だからです。
このあたりのサービスについては多数ありますのでネットで検索するか
新たな質問をされたほうがいいと思われます。

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>を使うべきです...続きを読む

Qres.nimg.jpとは?

IE9、win7です。
ニコニコ動画を見ようとすると
「Adobe Flash Player ローカルストレージ
res.nimg.jpはコンピュータに情報を保存する許可を要求しています」
が表示されます。

許可と拒否、どちらを選択すればいいのでしょうか?

Aベストアンサー

追加
「許可」を選択した場合は、Flas* Player で実行されるアプリケーションが、保存できるようになりますが、保存できるのは、要求されているディスク容量(1MB)まで。

「拒否」を選択した場合は、保存するためのディスク容量を増やせません。アプリケーションは引き続き動作しますが、使用可能なディスク容量を増やさないと続行できないので、閉じるか、ディスク容量を増やすことになります。
参考URL

参考URL:http://www.macromedia.com/support/documentation/jp/flashplayer/help/help06.html

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@myad.jpとはどこのプロバイダーでしょうか

標題の通り、メールアドレスで****@myad.jpというのはどこのプロバイダーですか?
フリーメールでしょうか。
教えてください。

Aベストアンサー

NECのBIGLOBEです。
下記のドメイン検索サイトで検索すると出てきます。

参考URL:http://www.mse.co.jp/ip_domain/

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ランキング