public Result(ResultSpec spec) { ResultSpec = spec; Type = ResultTypes.DirectURL; }
/// <summary> /// バックグラウンドワーカーの作業 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void bgw1_DoWork(object sender, DoWorkEventArgs e) { List <Result> results = new List <Result>(); if (e.Argument is List <String> args) { foreach (var arg in args) { try { if (Util.IsUrl(arg) == false) { var urls = Search.GetSearchResult(arg).Result; Thread.Sleep(1000); ResultSearch search = new ResultSearch(); foreach (var url in urls.URLs) { try { var s = ResultSpec.GetTextAsync(Util.SpecUrl(url), arg).Result; search.Specs.Add(s); Thread.Sleep(1000); } catch { } } Result result = new Result(search); result.Time = DateTime.Now; result.Word = arg; results.Add(result); } else { var t = arg.TrimEnd('/'); var s = ResultSpec.GetTextAsync(Util.SpecUrl(t)).Result; Thread.Sleep(1000); Result result = new Result(s); result.Time = DateTime.Now; result.Word = arg; results.Add(result); } } catch { } } Console.WriteLine(String.Join(",", args)); } e.Result = results; }
public static async Task <ResultSpec> GetTextAsync(string url, string searchword = null) { var s = new ResultSpec(); var doc = default(IHtmlDocument); using (var client = new HttpClient()) using (var stream = await client.GetStreamAsync(new Uri(url))) { // AngleSharp.Parser.Html.HtmlParserオブジェクトにHTMLをパースさせる var parser = new HtmlParser(); doc = parser.ParseDocument(stream); } // HTMLからtitleタグの値(サイトのタイトルとして表示される部分)を取得する var title = doc.QuerySelector(".titie"); s.Title = doc.Title; s.URL = url; s.SearchWord = searchword; var speclistElement = doc.QuerySelector("[class^=tbl]"); var specrowlistElement = speclistElement.QuerySelectorAll("tr:not([class^=itemview])"); foreach (var specrowElement in specrowlistElement) { var specheaderlistElement = specrowElement.QuerySelectorAll("th"); var specdetaillistElement = specrowElement.QuerySelectorAll("td"); foreach (var(specheaderElement, index) in specheaderlistElement.Select((item, index) => (item, index))) { if (specheaderElement.TextContent.Trim() != String.Empty) { var detail = new Detail(); detail.Key = specheaderElement.TextContent.Trim(); detail.Value = specdetaillistElement[index].TextContent.Trim(); s.Item.Add(detail); } } } var imagedoc = default(IHtmlDocument); using (var client = new HttpClient()) using (var stream = await client.GetStreamAsync(new Uri(String.Format(ImageUrlParts, s.ItemID)))) { // AngleSharp.Parser.Html.HtmlParserオブジェクトにHTMLをパースさせる var parser = new HtmlParser(); imagedoc = parser.ParseDocument(stream); } var imageElements = imagedoc.QuerySelectorAll("img"); foreach (IHtmlImageElement imageElement in imageElements) { string fullurl = imageElement.Source.Replace("/t/", "/fullscale/"); if (fullurl.Contains(s.ItemID) && !s.ImageUrls.Contains(fullurl)) { s.ImageUrls.Add(fullurl); } } var urlword = s.SearchWord ?? s.ItemID; DownloadImage.GetImages(Util.NetWorkFolderPath + urlword, s.ImageUrls); return(s); }
/// <summary> /// 検索結果の選択中の行が変更されたときのイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lvSearchResult_SelectedIndexChanged(object sender, EventArgs e) { //表示中アイテムが0件の場合はなにもしない if (lvSearchResult.Items.Count <= 0) { return; } //選択中アイテムがない場合はなにもしない if (lvSearchResult.SelectedItems.Count <= 0) { return; } //インデックスを取得する int i; int l = lvSearchResult.SelectedItems[0].Index; //検索履歴が選択されているか調べる //選択されていない場合はタグから親のインデックスを取得する if (lvSearchHistory.SelectedItems.Count <= 0) { i = (int)lvSearchResult.SelectedItems[0].Tag; } else { i = lvSearchHistory.SelectedItems[0].Index; } //インデックスより検索履歴件数が少ない場合は戻る if (this.Results.Count < i || this.Results[i].ResultNumber < l) { return; } //表示をリセットする ClearResultPrev(); //表示するデータを取得する var spec = new ResultSpec(); switch (this.Results[i].Type) { case ResultTypes.DirectURL: spec = this.Results[i].ResultSpec; break; case ResultTypes.Search: spec = this.Results[i].ResultSearch.Specs[l]; break; } selectingcode = spec.SearchWord ?? spec.ItemID; string str = String.Empty; foreach (var sp in spec.Item) { str += sp.Key + "\t" + sp.Value + "\r\n"; } //画面に設定 lblTitleDetail.Text = spec.Title; lblURLDetail.Text = spec.URL; txtResultPrev.Text = str; }