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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

4769閲覧

c# html~情報取得~表示

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

0クリップ

投稿2017/06/08 14:01

編集2017/06/11 10:41

私は、プログラミング言語のc#を学び始めた初心者です。

関東でIT関連の仕事をしています。

以前に、少し趣味でJavaを少しかじってましたが、自主的に少しやっていた程度です。
c#は今回が初めてです。コード記載にまだ理解が就いていかず、行き詰まり、質問させていただきました。

htmlから正規表現でコードを取得したんですが自分でやって見るとまだ完結出来ずにおります。

ソースコードは作成中のものなので、未完成です。

コードの内容は、以下の通りです。
アドバイスを頂けると助かります。

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { class Corection { private string category; private string title; public string Category { set { category = value; } get { return category; } } } static void Main(string[] args) { WebClient wc = new WebClient() { Encoding = Encoding.GetEncoding("UTF-8") }; Dictionary<String, String> dic = new Dictionary<String, String>(); for (int i = 1; i < 5; i++) { string html = wc.DownloadString("url"); wc.Dispose(); Regex reg = new Regex("<a href=\"(?<category>.*?)(?<title>.*?)</a>", string category = ""; string title = "[]"; Match m = reg.Match(html); m = m.NextMatch(); string c = m.Groups["category"].Value; string t = m.Groups["title"].Value; } dic.Add("category", "title"); //Console.WriteLine(); } } }
退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Javaが書けるのなら、一旦Javaで書いてみて、これをC#でやるのにはどういうアプローチでやるのだろうと考えた方が近道なような気がします
基本やらなきゃならないことは一緒なので

アプローチの一例

  • HTTPでコンテンツを取ってくるにはHttpClientGetAsync(Uri)あたりを使って いまからやるならHTTPからコンテンツを取ってくるとかは同期メソッドは使わないほうがいいかも?
  • 取ってきたコンテンツを正規表現で扱うにはRegexMatch(String)Matches(String)あたりを使って
  • 結果を入れるコレクションはList<T>にでも 使い方よってはDictionary<TKey, TValue>が楽なことも
  • ソートはList<T>に入れたのならList<T>.Sortあたりでも、自分で書いてもいい
  • foreachを使ってConsole.WriteLine

慣れてきたらLinqを使えばメソッドチェーンでほぼ一発で書けることも増えてきます
あと読み込むのがRSSとかAtomならSyndication Service Libraryを検討してみて、もし使えたら超絶楽をできるかも

投稿2017/06/08 18:54

編集2017/06/08 19:04
dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/10 12:30

質問にお答え頂きありがとうございました。 頂いたご意見を参考にしましたがそこまでの理解に乏しくて、あまりよろしくありませんが、課題を記載させて頂きました。 もしよろしければ、今一度ご教示頂ければと思います。 javaに関しては、業務で使っていたわけで無く独学で本での学習をしていた程度ですので、あまり詳しくありません。
dojikko

2017/06/10 19:57

仕事なのかどうなのかとかは触れずに書いておきます まず正規表現の理解が根本的に間違っているような こういう用向きなら正規表現でシコシコやらずに[Html Agility Pack](http://html-agility-pack.net/)みたいなのを使ってみては?
退会済みユーザー

退会済みユーザー

2017/06/11 07:44

コメントありがとうございます。 サイトに関しては、仕事で作っているものです。 あと、会社に入って特にこれらに関して指導はありません。 「与えられた条件をもとに」調べても構わないので作成する。のが目的のようです。 ただほぼ未経験に近いので、何から手を付けるか検討がつかなかったので質問させて頂いてます。 正規表現の使用は、条件に含まれているので他のを使うのは今回はできません。
guest

0

ベストアンサー

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Net; 5using System.Text.RegularExpressions; 6using System.Threading; 7 8 9namespace Crawlertest1 10{ 11 class Program 12 { 13 class Question 14 { 15 public string Category { get; set; } 16 public string Title { get; set; } 17 public int Number { get; set; } 18 } 19 20 static void Main(string[] args) 21 { 22 WebClient wc = new WebClient(); 23 wc.Encoding = System.Text.Encoding.UTF8; 24 25 List<Question> list = new List<Question>(); 26 27 for (int i = 0; i < 40; i++) 28 { 29 string data = wc.DownloadString($"https://teratail.com/questions/{79594 - i}"); 30 31 var r = new Regex(@"<title>(?<category>.*?) - (?<title>.*?)\((?<num>\d+?)\)|teratail</title>"); 32 var m = r.Match(data); 33 34 var tmp = new Question 35 { 36 Category = m.Groups["category"].Value, 37 Title = m.Groups["title"].Value, 38 Number = int.Parse(m.Groups["num"].Value) 39 }; 40 41 list.Add(tmp); 42 43 Thread.Sleep(4000); 44 } 45 46 var questionSort = list.OrderBy(o => o.Category).ThenBy(o => o.Number); 47 48 foreach (var q in questionSort) 49 { 50 Console.WriteLine($"{q.Category}:{q.Title}:{q.Number}"); 51 } 52 53 Console.ReadKey(); 54 } 55 } 56} 57

挑戦してみました。
teratailを対象に考えています。
アルファベットと番号順になると思います。

#追記 2017/06/11
この質問はとあるサイトからソースコードを取得し、そこから正規表現で
特定の情報を抜き出すという内容のものでした。
この質問は2017年6月11日に解決され、質問者の方針により質問と
質問を解決したこの回答の内容が改変されました。

第三者に改変される恐れがあるので万が一にそなえてこちらにも返信以下のコードを書いておきます。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text.RegularExpressions; 5using System.Net; 6using System.Threading; 7using Newtonsoft.Json; 8 9 10namespace Crawltest2 11{ 12 class Program 13 { 14 class Data 15 { 16 public string Category { get; set; } 17 public string Title { get; set; } 18 public string Date { get; set; } 19 public string Text { get; set; } 20 } 21 22 static List<string> Get_Data(string source, Regex re, string group) 23 { 24 List<string> tmp = new List<string>(); 25 26 Match get_data = re.Match(source); 27 28 while (get_data.Success) 29 { 30 tmp.Add(get_data.Groups[group].Value); 31 get_data = get_data.NextMatch(); 32 } 33 34 return tmp; 35 } 36 37 static void Main(string[] args) 38 { 39 WebClient wc = new WebClient(); 40 wc.Encoding = System.Text.Encoding.UTF8; 41 42 List<Data> for_show = new List<Data>(); 43 44 for (int i = 1; i < 6; i++) 45 { 46 string url = xxxxxxx{i}; 47 48 string html = wc.DownloadString(url); 49 50 List<string> tmp_categorys = Get_Data(html, new Regex(@"<li class=""category"" style="".*?"">(?<category>.*?)</li>"), "category"); 51 List<string> tmp_titles = Get_Data(html, new Regex(@"<li class=""title""><a href="".*?"">(?<title>.*?)</a></li>"), "title"); 52 List<string> tmp_date = Get_Data(html, new Regex(@"<li class=""date"">(?<date>.*?)</li>"), "date"); 53 List<string> tmp_text = Get_Data(html, new Regex(@"<li class=""description(|Single)"">(?<text>.*?)<"), "text"); 54 55 tmp_text.RemoveAt(0); 56 57 for (int n = 0; n < tmp_categorys.Count; n++) 58 { 59 Data tmp_data = new Data 60 { 61 Category = tmp_categorys[n], 62 Title = tmp_titles[n], 63 Date = tmp_date[n], 64 Text = tmp_text[n] 65 }; 66 67 for_show.Add(tmp_data); 68 } 69 70 // System.Threading.Thread.Sleep(4000); 71 } 72 73 var for_showSort = for_show.OrderBy(o => o.Category).ThenByDescending(o => o.Date); 74 75 string jsonstring = JsonConvert.SerializeObject(for_showSort, Formatting.Indented); 76 77 System.IO.StreamWriter sw = new System.IO.StreamWriter("test.txt", false, System.Text.Encoding.GetEncoding("shift_jis")); 78 79 sw.WriteLine(jsonstring); 80 81 sw.Close(); 82 } 83 } 84}

投稿2017/06/08 20:00

編集2017/06/16 16:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/10 12:27

このたびは、情報量が少ない中、お答え頂きありがとうございました。 頂いたソースコードを参考にさせて頂いたんです、まだまだ理解に乏しくて、課題を記載させて頂きました。 もしよろしければ、今一度ご教示頂ければと思います。
退会済みユーザー

退会済みユーザー

2017/06/10 23:01

ご回答ありがとうございます。 わかりやすく記載して頂き感謝しております。 実際に実行してみて、またいくつか疑問があったんですが、「イベント割引」以外のカテゴリをもってきたい場合、正規表現の部分を変更すればよろしいでしょうか? カテゴリは「女の子情報」「ここだけの話」「イベント情報」「新人体験入店」等があります。 課題の条件の「コレクション格納、カテゴリ並べ替え、「カテゴリ:タイトル」で出力」までの手順もイメージがつきにくくて 何度も申し訳ありません。
退会済みユーザー

退会済みユーザー

2017/06/11 10:53 編集

削除
退会済みユーザー

退会済みユーザー

2017/06/11 04:40

ご対応ありがとうございます。 Conssoleを実行すると「イベント割」と「100分・・・(以下省略)」が5回表示されて終わります。 送って頂いたサイトは午前中に自分も確認してましたが、少し理解できたと思い試したのですがなかなか思い通りにいかなかったです。 コレクションもDictionaryを使うと思うんですが、書いてみたコードが違っていたらしく失敗でした。 実行結果も自身で想像しなければならず、うまく説明できなくて申し訳ございません。 問題解決まで、お力貸していただけると助かります。
退会済みユーザー

退会済みユーザー

2017/06/11 10:53 編集

削除
退会済みユーザー

退会済みユーザー

2017/06/11 07:37

すみません。変更しましたが、実行結果が変更前と変わらずに終わってしまいます。
退会済みユーザー

退会済みユーザー

2017/06/11 08:54

何度も申し訳ありません。 実行されませんでした。
退会済みユーザー

退会済みユーザー

2017/06/11 09:22

1行ずつ実行してみると、while (get_category.Success)を無限ループしています。
退会済みユーザー

退会済みユーザー

2017/06/11 10:53 編集

削除
退会済みユーザー

退会済みユーザー

2017/06/11 10:34

出ました! 本当にありがとうございました。 頂いたコードをこれから自身で理解出来るように読解して行きます。 明日課題を提出してきます。 何度も申し訳ありませんでした。 あと、会社にバレないようにしたいので、少し質問を編集しますが気にしないでください。 後ほど評価させて頂きます。
退会済みユーザー

退会済みユーザー

2017/06/11 10:54 編集

削除
退会済みユーザー

退会済みユーザー

2017/06/11 10:48

ほんとですね。 残念です。でも削除までは運営側もしてくれなと思うので困りました(笑) あと回答頂いておきながら不躾で申し訳ありませんが、h_a様に頂いた補足部分のurlだけでも編集で隠して頂けないでしょうか? さすがに担当者も「編集」を押したりと、そのあたりまで見ないと思うので。
退会済みユーザー

退会済みユーザー

2017/06/11 10:50

構いませんよ。
toutou

2017/06/11 11:01

情報の漏洩で困るのはわかりますが、ぱっとみ何やってるかわからないので、後々見る方のためにあとでやったことをまとめてもらえると良いかもしれません。
退会済みユーザー

退会済みユーザー

2017/06/11 11:15

承知しました。
退会済みユーザー

退会済みユーザー

2017/06/12 10:43

先日は、ありがとうございました。 また解説頂きたい事があるのですが、宜しいでしょうか?
退会済みユーザー

退会済みユーザー

2017/06/13 04:11 編集

私に分かる範囲のことであれば。
退会済みユーザー

退会済みユーザー

2017/06/14 14:24

ありがとうございます。今回は何とか理解出来たので、また何かありましたらお願いします。
退会済みユーザー

退会済みユーザー

2017/06/15 10:29

h_a様、こんばんは。 解説頂きたい事が出来たのですが、サイト外メールのやりとりは、可能でしょうか?
退会済みユーザー

退会済みユーザー

2017/06/15 20:44

申し訳ありませんが、それは不可能です。 どうにか問題を抽象化していただいてこちらで質問を してもらったほうが私としてはやりやすいです。 私も最近C#を始めた人間で、そこまで自信があるわけでも技術が あるわけでもないので。
退会済みユーザー

退会済みユーザー

2017/06/15 22:32

かしこまりました。 web上のメモにアクセスして頂くことは可能でしょうか? (インストール不要) ソース張ってるだけです。
退会済みユーザー

退会済みユーザー

2017/06/16 00:00 編集

分かりました。が、ソースの解釈ということであれば プログラミングに関して私は知らないことの方が 多いのであまり期待しないでくださいね。
退会済みユーザー

退会済みユーザー

2017/06/16 15:45

確認しました。返信以下が、私のコードです。
退会済みユーザー

退会済みユーザー

2017/06/16 23:50

ありがとうございます。 自分でもコードが変更コードがかける様に、 かみ砕いて理解して、疑問があれば質問させて頂きます。
退会済みユーザー

退会済みユーザー

2017/06/17 01:54

いえいえ。どういたしまして。
退会済みユーザー

退会済みユーザー

2017/06/18 06:07

こんにちは。 お聞きしたいことがありまして、メモの続きに質問させて頂きました。
guest

0

引用テキスト正規表現での取得の仕方や

どんな HTML から、どういうデータを抽出したいのかが示されていないと、例示のしようがありません。

投稿2017/06/08 16:14

hidori

総合スコア402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/11 10:35 編集

今回はご指摘頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問