Ich versuche einen WebScraper zu erstellen, wo ich alle Download-Links für die CSS / JS / Bilder aus einer HTML-Datei bekomme.
Problem
Der erste Haltepunkt trifft, aber der zweite nicht, nachdem er "Weiter" gedrückt hat.
Code, von dem ich spreche:
private static async void GetHtml(string url, string downloadDir)
{
//Get html data, create and load htmldocument
HttpClient httpClient = new HttpClient();
//This code gets executed
var html = await httpClient.GetStringAsync(url);
//This code not
Console.ReadLine();
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
//Get all css download urls
var linkUrl = htmlDocument.DocumentNode.Descendants("link")
.Where(node => node.GetAttributeValue("type", "")
.Equals("text/css"))
.Select(node=>node.GetAttributeValue("href",""))
.ToList();
//Downloading css, js, images and source code
using (var client = new WebClient())
{
for (var i = 0; i <scriptUrl.Count; i++)
{
Uri uri = new Uri(scriptUrl[i]);
client.DownloadFile(uri,
downloadDir + @"\js\" + uri.Segments.Last());
}
}
Bearbeiten
Ich rufe die Methode getHtml von hier auf:
private static void Start()
{
//Create a list that will hold the names of all the subpages
List<string> subpagesList = new List<string>();
//Ask user for url and asign that to var url, also add the url to the url list
Console.WriteLine("Geef url van de website:");
string url = "https://www.hethwc.nl";
//Ask user for download directory and assign that to var downloadDir
Console.WriteLine("Geef locatie voor download:");
var downloadDir = @"C:\Users\Daniel\Google Drive\Almere\C# II\Download tests\hethwc\";
//Download and save the index file
var htmlSource = new System.Net.WebClient().DownloadString(url);
System.IO.File.WriteAllText(@"C:\Users\Daniel\Google Drive\Almere\C# II\Download tests\hethwc\index.html", htmlSource);
// Creating directories
string jsDirectory = System.IO.Path.Combine(downloadDir, "js");
string cssDirectory = System.IO.Path.Combine(downloadDir, "css");
string imagesDirectory = System.IO.Path.Combine(downloadDir, "images");
System.IO.Directory.CreateDirectory(jsDirectory);
System.IO.Directory.CreateDirectory(cssDirectory);
System.IO.Directory.CreateDirectory(imagesDirectory);
GetHtml("https://www.hethwc.nu", downloadDir);
}
Wie rufen Sie GetHtml
? Vermutlich stammt das von einer sync Main
Methode, und Sie haben keinen anderen Nicht-Worker-Thread im Spiel (weil Ihr Haupt-Thread beendet wurde): Der Prozess wird beendet. Etwas wie:
static void Main() {
GetHtml();
}
Das Obige wird den Prozess sofort beenden, nachdem GetHtml
zurückkehrt und die Main
Methode endet, die beim ersten unvollständigen await
liegt.
In aktuellen C # -Versionen (ab C # 7.1) können Sie eine async Task Main()
-Methode erstellen, mit der Sie Ihre GetHtml
Methode ordnungsgemäß await
können, solange Sie GetHtml
so ändern, dass die Task
:
async static Task Main() {
await GetHtml();
}