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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

C#

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

Q&A

1回答

1006閲覧

C# Html Agility Pack (HAP) スクレイピング

hemegi

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

C#

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

0グッド

0クリップ

投稿2020/08/21 09:13

前提・実現したいこと

C#のフォームアプリケーションで
用意したHTMLのソースを解析して、
指定した会社名の行をすべて抜き出して、ファイルに保存をする処理を実装したいです。

発生している問題・エラーメッセージ


欲しい情報が抜き出せない、全件抽出してしまっている


抜き出したデータをファイルに保存すると、抜き出したはずの文字列ではなく

txt

1System.Linq.Enumerable+WhereEnumerableIterator`1[HtmlAgilityPack.HtmlNode] 2 3```という文字列が表示される 4 5 6今回はデータが3つあるので 7```txt 8System.Linq.Enumerable+WhereEnumerableIterator`1[HtmlAgilityPack.HtmlNode] 9System.Linq.Enumerable+WhereEnumerableIterator`1[HtmlAgilityPack.HtmlNode] 10System.Linq.Enumerable+WhereEnumerableIterator`1[HtmlAgilityPack.HtmlNode]

というデータが保存されてしまう

該当のソースコード

HTML

1<div class="job-item"> 2 3 <p class="company"> 4 <span>ABC株式会社</span> 5 </p> 6 7 <h2 class="title">インフラエンジニア</h2> 8 9 <p class="main">エンジニアがスキル・収入UPできる環境</p> 10 11</div> 12 13 14 15<div class="job-item"> 16 17 <p class="company"> 18 <span>株式会社あいうえお</span> 19 </p> 20 21 <h2 class="title">PM候補</h2> 22 23 <p class="main">スキルを活かしたい方</p> 24 25</div> 26 27 28 29<div class="job-item"> 30 31 <p class="company"> 32 <span>ABC株式会社</span> 33 </p> 34 35 <h2 class="title">WEBエンジニア</h2> 36 37 <p class="main">エンジニアがスキル・収入UPできる環境</p> 38 39</div>

C#

1var doc = new HtmlAgilityPack.HtmlDocument(); 2 3//HTMLファイル読み込み 4StreamReader sr = new StreamReader(@"html.txt", Encoding.GetEncoding("Shift_JIS")); 5 string str = sr.ReadToEnd(); 6 sr.Close(); 7 8 9//読み込んだHTMLをパース 10doc.LoadHtml(str); 11 12//会社紹介の行全体(job-item)を読み込み、companyの中身(会社名)がABC株式会社の行を抜き出したい 13var nodes = doc.DocumentNode.SelectNodes(@"//*[@class=""job-item""]") 14 .Select(y => y.Descendants() 15 .Where(x => x.Attributes["class"].Value == "company") 16 .Where(x => x.InnerText.Trim() == "ABC株式会社")); 17 18//取得したデータをファイルに書き込み 19using (var wt = new StreamWriter(@"get.txt", false, Encoding.GetEncoding("shift_jis"))) 20 { 21 foreach (var node in nodes) 22 { 23 wt.WriteLine(node); 24 } 25 }

試したこと

取得した文字列が表示されないのは、nodeにInnerTextプロパティをつけてみましたが、HtmlNode型には定義されていないようで使用できませんでした。

LINQの部分は調べながら何度も書き直しましたが、思い通りの動きをさせられなかったです。

補足情報(FW/ツールのバージョンなど)

VisualStudio 2019
HtmlAgilityPack 1.11.24

理想

txt

1ABC株式会社 2インフラエンジニア 3エンジニアがスキル・収入UPできる環境 4 5ABC株式会社 6WEBエンジニア 7エンジニアがスキル・収入UPできる環境 8

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

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

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

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

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

hemegi

2020/08/21 09:38

ありがとうございます。 同じ方法で調べたのですが、InnerTextに欲しいデータがありました。 前回同様に書き込む変数にInnerTextプロパティをつけてみると、 'IEnumerable<HtmlNode>'に'InnerText'の定義が含まれておらず..... というエラーが発生します。
Zuishin

2020/08/21 09:39

IEnumerable<T> にはありません。foreach で列挙してください。
guest

回答1

0

C#

1using System.IO; 2using System.Linq; 3using System.Text; 4using System.Text.RegularExpressions; 5 6namespace Hogehoge 7{ 8 internal static class Program 9 { 10 private static void Main() 11 { 12 var doc = new HtmlAgilityPack.HtmlDocument(); 13 14 var sr = new StreamReader(@"html.txt", Encoding.GetEncoding("Shift_JIS")); 15 var str = sr.ReadToEnd(); 16 sr.Close(); 17 18 doc.LoadHtml(str); 19 20 var nodes = doc.DocumentNode.SelectNodes(@"//*[@class=""job-item""]") 21 .Where(x => x.ChildNodes["p"].Attributes["class"].Value == "company" && 22 x.ChildNodes["p"].InnerText.Trim() == "ABC株式会社"); 23 24 using (var wt = new StreamWriter(@"get.txt", false, Encoding.GetEncoding("Shift_JIS"))) { 25 foreach (var node in nodes) { 26 wt.WriteLine(Regex.Replace(node.InnerText, @"^\s+", "", RegexOptions.Multiline)); 27 } 28 } 29 } 30 } 31}

投稿2020/08/21 14:33

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問