#c# #html-agility-pack
#c# #html-agility-pack
Вопрос:
Вместо этого я пытаюсь загрузить изображения, извлекая только время и даты каждого изображения. Код работает, но только для времени и дат.
using System;
using System.Linq;
using System.IO;
using System.Xml;
using System.Net;
using HtmlAgilityPack;
public class Program
{
public static void Main()
{
var wc = new WebClient();
wc.BaseAddress = "https://something.com";
HtmlDocument doc = new HtmlDocument();
var temp = wc.DownloadData("/en");
doc.Load(new MemoryStream(temp));
var secTokenScript = doc.DocumentNode.Descendants()
.Where(e =>
String.Compare(e.Name, "script", true) == 0 amp;amp;
String.Compare(e.ParentNode.Name, "div", true) == 0 amp;amp;
e.InnerText.Length > 0 amp;amp;
e.InnerText.Trim().StartsWith("var region")
).FirstOrDefault().InnerText;
var securityToken = secTokenScript;
securityToken = securityToken.Substring(0, securityToken.IndexOf("arrayImageTimes.push"));
securityToken = secTokenScript.Substring(securityToken.Length).Replace("arrayImageTimes.push('", "").Replace("')", "");
var dates = securityToken.Trim().Split(new string[] { ";"}, StringSplitOptions.RemoveEmptyEntries);
var scriptDates = dates.Select(x => new ScriptDate { DateString = x });
foreach(var date in scriptDates)
{
Console.WriteLine("Date String: '" date.DateString "'tYear: '" date.Year "'t Month: '" date.Month "'t Day: '" date.Day "'t Hours: '" date.Hours "'t Minutes: '" date.Minutes "'");
}
}
public class ScriptDate
{
public string DateString {get;set;}
public int Year
{
get
{
return Convert.ToInt32(this.DateString.Substring(0, 4));
}
}
public int Month
{
get
{
return Convert.ToInt32(this.DateString.Substring(4, 2));
}
}
public int Day
{
get
{
return Convert.ToInt32(this.DateString.Substring(6, 2));
}
}
public int Hours
{
get
{
return Convert.ToInt32(this.DateString.Substring(8, 2));
}
}
public int Minutes
{
get
{
return Convert.ToInt32(this.DateString.Substring(10, 2));
}
}
}
}
но как я могу использовать тот же код для загрузки и сохранения изображений?
Пробовал это, но получаю исключение :
private void Download()
{
using (WebClient client = new WebClient()) // WebClient class inherits IDisposable
{
client.DownloadFile("https://something.com", @"C:templocalfile.html");
}
}
System.Net.WebException: «Удаленный сервер вернул ошибку: (500) Внутренняя ошибка сервера».
Я могу получить даты и часы, но я не могу получить источник для извлечения ссылок на изображения.
Пример ссылки на одно из изображений, как оно должно быть построено, например :
https://something.com/image?type=infraPolairamp;region=tuamp;timestamp=202012150230
но я хочу автоматически извлекать даты и часы со страницы для всех изображений, а затем автоматически создавать ссылки, а затем загружать изображения.
В первом коде я могу получить даты и часы каждого изображения, но я не могу загрузить исходный код страницы, поэтому я не могу извлекать и создавать ссылки для изображений.
Вот почему я подумал как-то использовать первый код также для создания ссылок на изображения, а затем загрузки изображений.
Комментарии:
1. вы должны попробовать загрузить в цикле foreach. у вас уже есть все необходимые данные. попробуйте изменить тип загружаемого файла на jpeg вместо html
Ответ №1:
Не совсем уверен, чего вы пытаетесь достичь с помощью datetimes, но с помощью HAP вы можете сделать что-то вроде этого:
HtmlElementCollection elements = doc.DocumentNode.SelectNodes("//img");
foreach (HtmlElement imageElement in elements)
{
var imageSrc = imageElement.Attributes["src"].Value
Download(imageSrc);
}
…
…
private void Download(src)
{
using (WebClient client = new WebClient()) // WebClient class inherits IDisposable
{
client.DownloadFile(src, @"C:temp" uniqueNameForFile ".jpg");
}
}
Это не идеальный ответ, но он должен помочь вам. Src может быть относительным, поэтому вам, возможно, придется добавить базовый адрес.