C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: C#でウェブサイトの取得と解析


(過去ログ 87 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■52087 / inTopicNo.1)  C#でウェブサイトの取得と解析
  
□投稿者/ あり (1回)-(2010/07/30(Fri) 15:38:01)

分類:[C#] 

まるっきり初心者なC#を使用し、ウェブサイトからある特定の情報を読み込もうとしております。
一度JAVAでRSSのサイトから読み込んだことはあるのですが、C#だとちんぷんかんぷんです・・・。

読み込むウェブサイト -(http://kamloops.en.craigslist.ca/jjj/
取り出したい情報 - (仕事のタイトル、場所、内容)

ひとつの情報の区切りは<P></P>が使用されており、仕事のタイトルは<a>< a>の間、場所は<font></font>の間、内容は<small><a>< a></small>の間に位置しております。


例:
<p><a>仕事のタイトル< a><font>場所</font><small><a>仕事内容< a></small></p>


現在のコード

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Web;

namespace Project
{
public class Class1
{
static void Main()
{
string url = "http://kamloops.en.craigslist.ca/jjj/";
WebClient wc = new WebClient();
Stream st = wc.OpenRead(url);
StreamReader sr = new StreamReader(st);
//Read the content of HTML
string html = sr.ReadToEnd();
sr.Close();
st.Close();

HtmlNodeList nodeList = html.GetNodesByTagName("p");

foreach (HtmlNode node in nodeList)
{
Console.WriteLine("node:{0}", node["href"]);
}

//Console.WriteLine(html);

}
}
}

ウェブサイトの取得まではできましたが、解析でとまっております。
HtmlNodeList、GetNodesByTagName、HtmlNodeがコンパイルエラーとなり、リフォレンスがないと表示されております。

どうぞご教授の程、よろしくお願いいたします。


引用返信 編集キー/
■52088 / inTopicNo.2)  Re[1]: C#でウェブサイトの取得と解析
□投稿者/ ごう (133回)-(2010/07/30(Fri) 15:50:06)
No52087 (あり さん) に返信
>HtmlNodeList、GetNodesByTagName、HtmlNodeがコンパイルエラーとなり

HtmlNodeListとか、HtmlNodeクラスを定義したDLLもしくはソースコードが他に必要で、
それをプロジェクトに組み込んでいないことが原因ではないかなと思います。
こちらのソースコードは、どこかのサイトを参考にされたものでしょうか?

引用返信 編集キー/
■52089 / inTopicNo.3)  Re[2]: C#でウェブサイトの取得と解析
□投稿者/ 774RR (524回)-(2010/07/30(Fri) 15:56:33)
とりあえずリンクをはっときます
http://ap.atmarkit.co.jp/bbs/core/vblab/23550

引用返信 編集キー/
■52090 / inTopicNo.4)  Re[1]: C#でウェブサイトの取得と解析
□投稿者/ 魔界の仮面弁士 (1725回)-(2010/07/30(Fri) 15:57:14)
No52087 (あり さん) に返信
> まるっきり初心者なC#を使用し
…それはどういう意味でしょうか?
(「まるっきり初心者なC#」という書籍かサイトがあるのかな?)


> HtmlNodeList、GetNodesByTagName、HtmlNodeがコンパイルエラーとなり、
> リフォレンスがないと表示されております。
# リファレンスの方が一般的かも。<reference

載っていないと言う事は、そもそも存在しない型という事かと思いますが、
それらのコードは、何かを参考に記述されたものなのでしょうか?

型名だけ見ると、mykonos2008 さんが作られたコードに似ていますが…。
http://www.google.co.jp/search?q=HtmlNodeList+site%3acsfun.blog49.fc2.com


> string html = sr.ReadToEnd();
> HtmlNodeList nodeList = html.GetNodesByTagName("p");
html は string 型(System.String)ですよね。
String に GetNodesByTagName というメソッドは存在しませんので、
これはエラーになってしまうはずです。

また、戻り値として利用している HtmlNodeList という型は、少なくとも、
> using System;
> using System.Collections.Generic;
> using System.Text;
> using System.Net;
> using System.Web;
で指定された名前空間には存在しません。エラーになるのもそのためでしょう。

google で『HtmlNodeList site:msdn.microsoft.com』というキーワードで調べても
ヒットしないところを見ると、.NET Framework には存在しないクラスのようですが、
HtmlNodeList というのは、何か自作された型なのでしょうか?


> ウェブサイトの取得まではできましたが、解析でとまっております。
WebBrowser コントロールを使って HtmlDocument クラス経由で処理するか、
または Regex クラスを用いて正規表現で切り出してみては如何でしょうか。
引用返信 編集キー/
■52091 / inTopicNo.5)  Re[2]: C#でウェブサイトの取得と解析
□投稿者/ あり (2回)-(2010/07/30(Fri) 16:08:31)
ごうさま。

返信ありがとうございます。
http://csfun.blog49.fc2.com/blog-entry-19.html
こちらのサイトを参考にしました。おっしゃるとおり、ソースコードの組み込みが必要でした。しかし、組み込んだ後にもエラーがおきるため、他の方法を探しております。


774RRさま。
そちらは私が投稿したものですが、返信があまり早くないため、こちらの投稿させていただきました。



魔界の仮面弁士さま。

いろいろとご指導ありがとうございます。

>WebBrowser コントロールを使って HtmlDocument クラス経由で処理するか、
または Regex クラスを用いて正規表現で切り出してみては如何でしょうか。

こちらのやり方でやりたいと思います。ただ調べてみないと私のレベルでできるかどうかわかりませんが・・・。
引用返信 編集キー/
■52092 / inTopicNo.6)  Re[3]: C#でウェブサイトの取得と解析
□投稿者/ ごう (134回)-(2010/07/30(Fri) 16:15:30)
No52091 (あり さん) に返信
> ごうさま。
>
> 返信ありがとうございます。
> http://csfun.blog49.fc2.com/blog-entry-19.html
> こちらのサイトを参考にしました。おっしゃるとおり、ソースコードの組み込みが必要でした。しかし、組み込んだ後にもエラーがおきるため、他の方法を探しております。


どうやって組み込んだの?

そちらのサイトにあるDLL (CreteLib.dll) をダウンロードしてきて、
Visual C#の「プロジェクト」→「参照の追加」→「参照」タブを選択してCreteLib.dllを指定 ってやってる?

※もしくは「using CreteLib;」の記述忘れとか?


それでもダメなら、どんなエラーが出たか詳細に書きましょう。

引用返信 編集キー/
■52093 / inTopicNo.7)  Re[4]: C#でウェブサイトの取得と解析
□投稿者/ あり (4回)-(2010/07/30(Fri) 16:29:04)
ごうさま。

失礼いたしました。

using CreteLib;は記述しており、CreteLib.dllもダウンロード、参照しております。
他のエラーはusing CreteLib;を記述後きえたのですが、”doc.Load(source);”のLoadの部分がCreteLibには存在しないとエラーになりました。

なにか設定忘れがあったのでしょうか・・・・
引用返信 編集キー/
■52095 / inTopicNo.8)  Re[3]: C#でウェブサイトの取得と解析
□投稿者/ みきぬ (936回)-(2010/07/30(Fri) 17:17:14)
本題とはあまり関係ない質問ですみませんが…

No52091 (あり さん) に返信
> 774RRさま。
> そちらは私が投稿したものですが、返信があまり早くないため、こちらの投稿させていただきました。
>
ってどういうことでしょうか。

いちおう、いくつか可能性を考えたのですが…。
・向こうのスレを見ると、12:48 にあった質問に対して、8分後の 12:56 に最初のコメントがついてますが、これをもって早くないと言っている?
・最初のコメントから2つめのコメント(13:39)までの間に、43分が経過していることをもって早くないと言っている?
・最初のコメントに対する返信(13:45)までに(当該サイトの障害か何かで)49分も経過してしまったことをもって早くないと言っている?
・2つめのコメントに対する返信(15:29)を行うまでに(当該サイトの障害か何かで)1時間50分も経過してしまったことをもって早くないと言っている?
・15:29 にあった追加質問から 9分(ここでの質問書き込み時間から判断)経ってもコメントがなかったことをもって早くないと言っている?
・それとも、向こうのサイトとこのサイトでは時刻が大きくずれている?

いまいちどれもしっくりこなかったので、教えてもらえるとありがたいです。
引用返信 編集キー/
■52096 / inTopicNo.9)  Re[4]: C#でウェブサイトの取得と解析
□投稿者/ あり (6回)-(2010/07/30(Fri) 17:28:16)
今回は急ぎで仕上げなければいけないために、2つの場所に投稿させていただきました。(今回が初めてです。)こちらの掲示板ははじめて使用しますが、.NET利用者と返信数が向こうの掲示板より多そうだったために「返信があまり早くないため」と不適切な言い回しをしてしまいました。ご気分を害されたなら、申し訳ございません。
引用返信 編集キー/
■52097 / inTopicNo.10)  Re[3]: C#でウェブサイトの取得と解析
□投稿者/ ごう (135回)-(2010/07/30(Fri) 17:43:17)
急ぎみたいだけどさ、私も急ぎで18時から病院で、リハビリの予約はいってるから答えられないよ。今携帯から書いてるし。ごめんね。
一つアドバイスすると、docの型が間違ってるんじゃないかと思いますよ。
引用返信 編集キー/
■52098 / inTopicNo.11)  Re[4]: C#でウェブサイトの取得と解析
□投稿者/ あり (7回)-(2010/07/30(Fri) 18:13:04)
ごうさま。

> 急ぎみたいだけどさ、私も急ぎで18時から病院で、リハビリの予約はいってるから答えられないよ。今携帯から書いてるし。ごめんね。
お忙しい中、色々とご教授いただきありがとうございます。




> 一つアドバイスすると、docの型が間違ってるんじゃないかと思いますよ。
http://csfun.blog49.fc2.com/blog-entry-19.html
こちらのサイトからコードをそのままコピペして実行したところ、

”Error 1 'CreteLib.HtmlDocument' does not contain a definition for 'Load' and no extension method 'Load' accepting a first argument of type 'CreteLib.HtmlDocument' could be found (are you missing a using directive or an assembly reference?) C:\\Projects\Project3\Project3\Class1.cs 14 17 Project3

というエラーがでてます。

実行コード:
using System;
using System.Collections.Generic;
using System.Text;
using CreteLib;
namespace Project3
{
class Class1
{
static void Main()
{
String source = "<html><body>HTML</body></html>";

HtmlDocument doc = new HtmlDocument();
doc.Load(source);
}
}
}

ちなみにCreteLibはダウンロード・参照しております。

コードはそのまま使用しているので、考えられるのはVisual Studio 2008の設定でしょうか・・。
他も色々と試して見ます。
色々とありがとうございました。
引用返信 編集キー/
■52099 / inTopicNo.12)  Re[5]: C#でウェブサイトの取得と解析
□投稿者/ 魔界の仮面弁士 (1726回)-(2010/07/30(Fri) 19:01:15)
No52098 (あり さん) に返信
> ”Error 1 'CreteLib.HtmlDocument' does not contain a definition for 'Load' and no extension method 'Load' accepting a first argument of type 'CreteLib.HtmlDocument' could be found (are you missing a using directive or an assembly reference?) C:\\Projects\Project3\Project3\Class1.cs 14 17 Project3

要するに「HtmlDocument クラスに Load という名のメソッドはありません。」の意ですね。
内容的には、コンパイラ エラー CS1061 に相当します。(英語版の Visual Studio をお使いですか?)
http://msdn.microsoft.com/ja-jp/library/bb383961.aspx

上記の日本語メッセージに照らし合わせれば、対応訳はおそらく

『'CreteLib.HtmlDocument' に 'Load' の定義が含まれておらず、型 'CreteLib.HtmlDocument' の
 最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたは
 アセンブリ参照が不足しています。』

といった所でしょう。


> ちなみにCreteLibはダウンロード・参照しております。
DLL をダウンロードして Reflector にかけてみましたが、該当クラスに
Load というメソッドは実装されていませんでした。似た名前のもので、
LoadHtml というメソッドがあるようですが、これは使えませんか?


> コードはそのまま使用しているので、考えられるのはVisual Studio 2008の設定でしょうか・・。
> 他も色々と試して見ます。
Load メソッドが実装されていないところをみると、そもそも、その作者のサンプルコードが
間違っているとか、あるいは DLL の仕様が変更されたといった可能性も考えられます。

メールアドレスも公開されているようですし、作者にメールまたは blog コメントで
質問してみては如何でしょう。
引用返信 編集キー/
■52100 / inTopicNo.13)  Re[6]: C#でウェブサイトの取得と解析
□投稿者/ あり (9回)-(2010/07/30(Fri) 19:33:33)
魔界の仮面弁士さま

返信ありがとうございます。ノートPCが英語版のため、英語版の Visual Studioをしようしております。
私もLoadHtmlの間違いかもしれませんので、そちらを定義して試して見ます。

WebBrowser コントロールを使って HtmlDocument クラス経由で処理する方法と、Regex クラスを用いる方法を調べて実行してみました。
HtmlDocument クラスは中身を完全に理解しきれなかったので、Regex クラスを使用してみました。
Regexクラスは思っていたよりも、使いやすかったため、非常にわかりやすいコードになりました。

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;

namespace Project
{
public class Class2
{
static void Main()
{
//Regex class
string p = "<p>.*?< href=\".*?>(?<title>.*?)<a>.*?<font size=\".*?>(?<place>.*?)</font>.*?<small class=\".*?>< href=\".*?>(?<desc>.*?)<a></small>.*?</p>";

//Set URL
WebClient wc = new WebClient();
string html = wc.DownloadString("http://kamloops.en.craigslist.ca/jjj/");

Regex re = new Regex(p, RegexOptions.IgnoreCase
| RegexOptions.Singleline);
int i = 0;
//Read and write values
for (Match m = re.Match(html); m.Success; m = m.NextMatch())
{
string title = m.Groups["title"].Value;
string place = m.Groups["place"].Value;
string desc = m.Groups["desc"].Value.Replace("&nbsp;"," ");

Console.WriteLine(i+":"+title+", " + place +", " + desc);
i++;
}
}
}
}

今回は時間の関係上こちらを使用しようとおもいます。先ほどのコードは後ほど試してみようと思います。
HtmlDocument クラスと、Regex クラスを用いる方法など考えもつかず、大変勉強になりました。



魔界の仮面弁士さま、ごうさま
お忙しい中、時間を割いていただき、大変ありがとうございました。
解決済み
引用返信 編集キー/
■52102 / inTopicNo.14)  Re[7]: C#でウェブサイトの取得と解析
□投稿者/ ごう (136回)-(2010/07/30(Fri) 21:23:51)
帰宅したので試してみました。

HtmlDocumentクラスは、CreteLib名前空間のものを使うってことを明示しないといけませんでした。
「CreteLib.HtmlDocument doc」 とすれば、できるようでしたよ。

後学のために、記録しておきます。

//----------------------------------------------------------------------
// わんくまブログ一覧を使ったサンプル
//----------------------------------------------------------------------
string url = "http://blogs.wankuma.com/";
WebClient wc = new WebClient();
Stream st = wc.OpenRead(url);
StreamReader sr = new StreamReader(st);
//Read the content of HTML
string html = sr.ReadToEnd();
sr.Close();
st.Close();

CreteLib.HtmlDocument doc = new CreteLib.HtmlDocument();
doc.LoadHtml(html);

HtmlNodeList nodeList = doc.GetNodesByTagName("a");

foreach (HtmlNode node in nodeList)
{
    Console.WriteLine(node["href"]);
}

解決済み
引用返信 編集キー/
■52109 / inTopicNo.15)  Re[8]: C#でウェブサイトの取得と解析
□投稿者/ 魔界の仮面弁士 (1727回)-(2010/07/30(Fri) 23:37:12)
No52102 (ごう さん) に返信
> HtmlDocumentクラスは、CreteLib名前空間のものを使うってことを明示しないといけませんでした。
> 「CreteLib.HtmlDocument doc」 とすれば、できるようでしたよ。
No52098 を見る限り、明示はされていたようですよ。using 句で。


追伸:
コードを投稿する際は、送信時に[投稿モード]を図表モードに切り替えておいてください。>ありさん
解決済み
引用返信 編集キー/
■52113 / inTopicNo.16)  Re[9]: C#でウェブサイトの取得と解析
□投稿者/ ごう (138回)-(2010/07/31(Sat) 07:51:32)
No52109 (魔界の仮面弁士 さん) に返信
> ■No52102 (ごう さん) に返信
>>HtmlDocumentクラスは、CreteLib名前空間のものを使うってことを明示しないといけませんでした。
>>「CreteLib.HtmlDocument doc」 とすれば、できるようでしたよ。
> No52098 を見る限り、明示はされていたようですよ。using 句で。
>

HtmlDocumentクラスは、System.Windows.Forms名前空間にもあるので、
「どちらのHtmlDocumentクラスを使うか」明示しないといけないようです。

HtmlDocument クラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmldocument(VS.80).aspx

ありさんのを見た感じだとコンソールアプリを作っているようですが
フォームアプリを作る際には考慮する必要がありますね。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -