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

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

ただいまの
回答率

89.99%

c# html~情報取得~表示

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,263
退会済みユーザー

退会済みユーザー

私は、プログラミング言語の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();

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

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/10 21:30

    質問にお答え頂きありがとうございました。
    頂いたご意見を参考にしましたがそこまでの理解に乏しくて、あまりよろしくありませんが、課題を記載させて頂きました。
    もしよろしければ、今一度ご教示頂ければと思います。

    javaに関しては、業務で使っていたわけで無く独学で本での学習をしていた程度ですので、あまり詳しくありません。

    キャンセル

  • 2017/06/11 04:57

    仕事なのかどうなのかとかは触れずに書いておきます

    まず正規表現の理解が根本的に間違っているような

    こういう用向きなら正規表現でシコシコやらずに[Html Agility Pack](http://html-agility-pack.net/)みたいなのを使ってみては?

    キャンセル

  • 2017/06/11 16:44

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

    キャンセル

checkベストアンサー

0

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


namespace Crawlertest1
{
    class Program
    {
        class Question
        {
            public string Category { get; set; }
            public string Title { get; set; }
            public int Number { get; set; }
        }

        static void Main(string[] args)
        {
            WebClient wc = new WebClient();
            wc.Encoding = System.Text.Encoding.UTF8;

            List<Question> list = new List<Question>();

            for (int i = 0; i < 40; i++)
            {
                string data = wc.DownloadString($"https://teratail.com/questions/{79594 - i}");

                var r = new Regex(@"<title>(?<category>.*?) - (?<title>.*?)\((?<num>\d+?)\)|teratail</title>");
                var m = r.Match(data);

                var tmp = new Question
                {
                    Category = m.Groups["category"].Value,
                    Title = m.Groups["title"].Value,
                    Number = int.Parse(m.Groups["num"].Value)
                };

                list.Add(tmp);

                Thread.Sleep(4000);
            }

            var questionSort = list.OrderBy(o => o.Category).ThenBy(o => o.Number);

            foreach (var q in questionSort)
            {
                Console.WriteLine($"{q.Category}{q.Title}{q.Number}");
            }

            Console.ReadKey();
        }
    }
}


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

追記 2017/06/11

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Net;
using System.Threading;
using Newtonsoft.Json;


namespace Crawltest2
{
    class Program
    {
        class Data
        {
            public string Category { get; set; }
            public string Title { get; set; }
            public string Date { get; set; }
            public string Text { get; set; }
        }

        static List<string> Get_Data(string source, Regex re, string group)
        {
            List<string> tmp = new List<string>();

            Match get_data = re.Match(source);

            while (get_data.Success)
            {
                tmp.Add(get_data.Groups[group].Value);
                get_data = get_data.NextMatch();
            }

            return tmp;
        }

        static void Main(string[] args)
        {
            WebClient wc = new WebClient();
            wc.Encoding = System.Text.Encoding.UTF8;

            List<Data> for_show = new List<Data>();

            for (int i = 1; i < 6; i++)
            {
                string url = xxxxxxx{i};

                string html = wc.DownloadString(url);

                List<string> tmp_categorys = Get_Data(html, new Regex(@"<li class=""category"" style="".*?"">(?<category>.*?)</li>"), "category");
                List<string> tmp_titles = Get_Data(html, new Regex(@"<li class=""title""><a href="".*?"">(?<title>.*?)</a></li>"), "title");
                List<string> tmp_date = Get_Data(html, new Regex(@"<li class=""date"">(?<date>.*?)</li>"), "date");
                List<string> tmp_text = Get_Data(html, new Regex(@"<li class=""description(|Single)"">(?<text>.*?)<"), "text");

                tmp_text.RemoveAt(0);

                for (int n = 0; n < tmp_categorys.Count; n++)
                {
                    Data tmp_data = new Data
                    {
                        Category = tmp_categorys[n],
                        Title = tmp_titles[n],
                        Date = tmp_date[n],
                        Text = tmp_text[n]
                    };

                    for_show.Add(tmp_data);
                }

                // System.Threading.Thread.Sleep(4000);
            }

            var for_showSort = for_show.OrderBy(o => o.Category).ThenByDescending(o => o.Date);

            string jsonstring = JsonConvert.SerializeObject(for_showSort, Formatting.Indented);

            System.IO.StreamWriter sw = new System.IO.StreamWriter("test.txt", false, System.Text.Encoding.GetEncoding("shift_jis"));

            sw.WriteLine(jsonstring);

            sw.Close();
        }
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/17 08:50

    ありがとうございます。

    自分でもコードが変更コードがかける様に、
    かみ砕いて理解して、疑問があれば質問させて頂きます。

    キャンセル

  • 2017/06/17 10:54

    いえいえ。どういたしまして。

    キャンセル

  • 2017/06/18 15:07

    こんにちは。

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/10 21:33 編集

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

    キャンセル

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

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