先ほど書いたように、code snippet私は現在、特定のサブディレクトリから複数の画像をローカルディレクトリに一度に格納しようとしています。私の問題は、LINQ文が正しく機能することができないということです。LINQでSystem.NullReferenceExceptionが発生しました
(...)
Level 1: <div class="content">...</div>
Level 2: <div class="spacer">...</div>
Level 3: <div class="siteTable">...</div>
Level 4: <div class=" thing id-t3_6dj7qp odd link ">...</div>
Level 5: <a class="thumbnail may-blank outbound" href="href="http://i.imgur.com/jZ2ZAyk.jpg"">...</a>
:私はまた、私はHTMLページを見ていたし、私が取得することを目指しリンクはhref
属性の中にレベル5に隠されていることが判明したのはなぜサムネイル画像をダウンロードしたくありませんそれはラインで私の最善の策だった「???」:悲しいことに十分な、それはそれはワットではありません、なぜ
Object reference not set to an instance of an object
さて、今私が知っていることを示すerrorをスロー
.Where(link => Directory.GetParent(link).Equals(@"http://i.imgur.com"))
しかし、私はまだラムダ式にはまったく新しいので、この行をどのように書き直すのか分かりません。正直言って、なぜ私が最初にSystem.NullReferenceException
を得たのか分からないが、次の行にはない。違いは何ですか?多分この問題に対する私のアプローチはまったく良い練習ではありませんので、どうすれば進んでいくか教えてください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Net;
using HtmlAgilityPack;
namespace GetAllImages
{
class Program
{
static void Main(string[] args)
{
List<string> imageLinks = new List<string>();
// Specify Directory manually
string dirName = "Jessica Clements";
string rootPath = @"C:\Users\Stefan\Desktop";
string dirPath = Path.Combine(rootPath, dirName);
// Specify the subReddit manually
string subReddit = "r/Jessica_Clements";
string url = @"https://www.reddit.com/" + subReddit;
try
{
DirectoryInfo imageFolder = Directory.CreateDirectory(dirPath);
HtmlDocument document = new HtmlWeb().Load(url);
imageLinks = document.DocumentNode.Descendants("a")
.Select(element => element.GetAttributeValue("href", null))
.Where(???)
.Where(stringLink => !String.IsNullOrEmpty(stringLink))
.ToList();
foreach(string link in imageLinks)
{
using (WebClient _wc = new WebClient())
{
_wc.DownloadFileAsync(new Uri(link), Path.Combine(dirPath, Path.GetFileName(link)));
}
}
Console.WriteLine($"Files successfully saved in '{Path.GetFileName(dirPath)}'.");
}
catch(Exception e)
{
while(e != null)
{
Console.WriteLine(e.Message);
e = e.InnerException;
}
}
if(System.Diagnostics.Debugger.IsAttached)
{
Console.WriteLine("Press any key to continue . . .");
Console.ReadKey(true);
}
}
}
}
編集:この行は、例外をスローすることを考えると
HtmlDocument document = new HtmlWeb().Load(url);
imageLinks = document.DocumentNode.Descendants("a")
.Select(element => element.GetAttributeValue("href", null))
.Where(link => (link?.Contains(@"http://i.imgur.com") == true))
.Distinct()
.ToList();
あなたの問題へのより良いアプローチは、[JSONのAPI](httpsを使用することであるようなものが必要です。// WWWを。 reddit.com/r/Jessica_Clements/.json)を使用してください。 – Nasreddine