Парсинг страницы (сломался) - C#
Формулировка задачи:
Доброго времени суток!
Нужна помощь.
История такова, парсер работал около 2-х лет, и внезапно перестал парсить данные.
На первый взгляд исходный код страницы не поменялся.
В чём причина, так и не понял, парсинг практически не знаю (метод тыка не помог)
Пример страницы для парсинга:
http://www.stoloto.ru/5x36/archive
рабочий код такой (был):
прошу помочь, очень нужен парсер.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.IO; namespace парсер_5_36 { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Enabled = false; string url = "http://www.stoloto.ru/5x36/archive"; try { WebClient client = new WebClient(); client.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(client_DownloadProgressChanged); client.Encoding = System.Text.Encoding.UTF8; client.DownloadStringCompleted += (sender, e) => { if (!e.Cancelled && e.Error == null) { result = e.Result; button1.Enabled = true; // button1.PerformClick(); } }; client.DownloadStringAsync(new Uri(url)); client.Dispose(); } catch { MessageBox.Show("Сервер сбросил соеденение"); } } string result = string.Empty; private void button1_Click(object sender, EventArgs e) { FileStream fs = new FileStream(Application.StartupPath + "\\5-36.txt", FileMode.Create); StreamWriter streamWriter = new StreamWriter(fs); richTextBox1.Clear(); var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(result); var monthList = doc.DocumentNode.SelectNodes("//div[@class='month']"); foreach (var month in monthList) { var elemList = month.ChildNodes.Where(x => x.Name == "div" && x.Attributes["class"].Value == "elem"); foreach (var elem in elemList) { var indoc = new HtmlAgilityPack.HtmlDocument(); indoc.LoadHtml(elem.InnerHtml); HtmlAgilityPack.HtmlNode a = indoc.DocumentNode.SelectSingleNode("//a"); HtmlAgilityPack.HtmlNode ins = indoc.DocumentNode.SelectSingleNode("//ins"); string date = string.Empty; richTextBox1.AppendText(String.Format("{0} {1}", a.InnerText, date)); richTextBox1.AppendText("_ "); var numberList = indoc.DocumentNode.SelectNodes("//b"); StringBuilder sb = new StringBuilder(256); int dj = 0; foreach (var num in numberList) { dj = dj + 1; if (dj < 6) sb.Append(num.InnerText.Replace(" ", " ")); } dj = 0; richTextBox1.AppendText(sb.ToString().TrimEnd() + Environment.NewLine); } } richTextBox1.SaveFile(fs, RichTextBoxStreamType.PlainText); streamWriter.Close(); fs.Close(); streamWriter.Dispose(); fs.Dispose(); progressBar1.Value = 0; MessageBox.Show("Успешное обновление!"); this.Close(); } } }
Решение задачи: «Парсинг страницы (сломался)»
textual
Листинг программы
using AngleSharp.Parser.Html; using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using System.Net.Http; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace test { class Program { static void Main(string[] args) { MainAsync().Wait(); Console.Read(); } static async Task MainAsync() { Program p = new Program(); var content = await p.HttpGetStringContentAsync(@"http://www.stoloto.ru/5x36/archive"); var parsingContent = p.ParseHtml(content); Console.WriteLine(string.Join(Environment.NewLine, parsingContent.Select(item => $"{item.Date}\t{item.Draw}\t{item.Numbers}\t{item.Prize}"))); } private List<Stoloto> ParseHtml(string content) { var parser = new HtmlParser(); var document = parser.Parse(content); var container = ".month .elem"; var dateContainer = ".main .draw_date"; var drawContainer = ".main .draw"; var numbersContainer = ".main .numbers .container.cleared:not(.sorted)"; var prizeContainer = ".main .prize"; return document.QuerySelectorAll(container) .Select(item => new Stoloto { Date = item.QuerySelector(dateContainer).TextContent.Trim(), Draw = item.QuerySelector(drawContainer).TextContent.Trim(), Numbers = Regex.Replace(item.QuerySelector(numbersContainer).TextContent, @"[\W\D]+", " ").Trim(), Prize = Regex.Replace(item.QuerySelector(prizeContainer).TextContent, @"[\W\D]+", " ").Trim(), }).ToList(); } private async Task<string> HttpGetStringContentAsync(string url) { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); using (HttpResponseMessage response = await httpClient.GetAsync(new Uri(url))) { var bytes = await response.Content.ReadAsByteArrayAsync(); Encoding encoding = Encoding.GetEncoding("utf-8"); return encoding.GetString(bytes, 0, bytes.Length); } //using (HttpResponseMessage response = await httpClient.GetAsync(new Uri(url))) //using (var responseStream = await response.Content.ReadAsStreamAsync()) //using (var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress)) //using (var streamReader = new StreamReader(decompressedStream)) //{ // return await streamReader.ReadToEndAsync(); //} } } public class Stoloto { public string Date { get; set; } public string Draw { get; set; } public string Numbers { get; set; } public string Prize { get; set; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д