概要
C#でスクレイピングアプリを作成しています。
その中でLinQでは実現出来ないが、foreachだと実現できる箇所があるので原因を知りたいです。
DOM操作用にAngleSharpというライブラリを使っています。
環境
.NET Framework3.1
C# 8.0
AngleSharp v0.16.0
実現したいこと
frame要素の下位階層を取得したいです。
具体的には上記画像の``href=""`の値を取得したいです。
html
1<frame> 2 #document 3 <html> 4 <body> 5 <table> 6 <tbody> 7 <tr> 8 <td> 9 <strong> 10 <a href="<取得したいプロパティ値>"> 11
#試した方法
いずれの方法でもframeで分割されたURLを再度呼び出し下位階層にアクセスを試みています。
csharp
1 //下記だと取得できる 2 var urlListInFrame = new List<string>() 3 .AddRelativePathUrls(domain, frameLinks, relativeRegex); 4 5 foreach (var frameUrl in urlListInFrame) 6 { 7 //frame内のa/hrefを取得 8 var documentInFrame = await context.OpenAsync(frameUrl); 9 var linksInFrame = documentInFrame.GetElementByAttr("a", "href"); 10 var urlListInFrame = new List<string>() 11 .AddUrls(baseUrl, linksInFrame, flagRegex); 12 foreach (var url in urlListInFrame) 13 { 14 Console.WriteLine(url); 15 } 16 } 17 18 //下記だと取得できない 19 var urlListInFrame = new List<string>() 20 .AddRelativePathUrls(domain, frameLinks, relativeRegex) 21 .Select(async frameUrl => 22 { 23 var documentInFrame = await context.OpenAsync(frameUrl); 24 var linksInFrame = documentInFrame.GetElementByAttr("a", "href"); 25 26 return new List<string>() 27 .AddFlagUrls(baseUrl, linksInFrame, flagRegex); 28 }); 29 30 foreach (var url in urlListInFrame) 31 { 32 Console.WriteLine(url); 33 } 34
デバッグするとvar documentInFrame = await context.OpenAsync(frameUrl);
の宣言がなされないまま処理終了しています。
またLinQを用いた方法で実行した際には下記のメッセージが出力されます。
エラーや例外は出ません。
csharp
1//可読性のため適当に改行しましたが元々はワンライナーで出力されています。 2System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1 3[System.Collections.Generic.List`1[System.String], 4ScrapingWithAngleSharp.Program+<>c__DisplayClass0_0+<<Main>b__0>d]
教えてほしいこと
同じ処理に見えますが、なぜforeachの書き方だと想定どおりに動きLinQの書き方では上手く行かないのか、
手がかりだけでも教えていただければ幸いです。
宜しくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/31 08:48
2021/08/31 12:07