[C# "Basics"] Parse HTML с HTML Agility Pack
Здравейте колеги. Реших да си поиграя и да си напиша програма, която да обхожда даден блог по зададен Url и да прави списък с брой харесвания на постове и линковете към тях. Става дума за блог, който има следната структура на страниците : http://blog.somesite.com/page/1 ,2,3...n .
За момента успях да си съчиня следното :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HtmlAgilityPack;
namespace ParsingHTML
{
public partial class SiteScraper : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void ClickMeButton_Click(object sender, EventArgs e)
{
var getHtmlWeb = new HtmlWeb();
var document = getHtmlWeb.Load(InputTextBox.Text);
var aTags = document.DocumentNode.SelectNodes("//div[@id='datetag'] //a[position()=2]");
Dictionary<int, string> mydict = new Dictionary<int, string>();
string link;
string note;
int number;
if (aTags != null)
{
foreach (var aTag in aTags)
{
note = aTag.InnerHtml;
link = aTag.Attributes["href"].Value;
note = note.Replace(",", "");
note = note.Replace(" notes", "");
bool isNumber = Int32.TryParse(note, out number);
mydict.Add(number, link);
}
mydict = mydict.OrderByDescending(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
foreach (KeyValuePair<int, string> kvp in mydict)
{
OutputLabel.Text += "- " + kvp.Key + " " + kvp.Value + "<br />";
}
}
}
}
}
Между другото, има ли някакъв C# Syntax Highlighter във форума или някакъв друг вариант да си подреждам по-добре кода като го пиша тук? Не съм ползвал много форума до момента, съжалявам.
Това за момента успешно ми намира харесванията ("notes"), линка към тях и ми ги подрежда по брой харесвания.
За момента обаче имам следните проблеми и питания:
- как да обходя всички страници от блога
- вариант а) ако не знам колко точно са
- вариант б) ако знам, че са 123, например.
Крайният резултат искам да ми даде пак такъв списък, но с данни от всички страници, т.е. - ако например блога е с 3 страници, на първата пост 1 има 100 харесвания, на 2-рата пост 2 има 200 харесвания, а на третата пост 3 има 300 - да ми ги изкара във списък от най-голямото към най-малкото.
На мен за момента ми идват 2 идеи - или някак да наблъскам съдържанието на всички страници в 1 документ и после да си вадя нещата от там, или страница по страница да се добавят нещата в речника и накрая просто да си ги foreach-на, както до момента.
Ще съм благодарен, ако някой ми помогне с съвети/насоки! :)
Доста интересна задачка :). Ще може ли да качиш кода в pastebin или github, понеже тук много гадно се чете.
Иначе това, което искаш да направиш, ми прилича на web crawler. На твое място бих направил обхождането на блога рекурсивно, т.е. да влиза във всеки хиперлинк, който намери в текущата страница, после в хиперлинковете на страницата, към която предният хиперлинк я отвел, и т.н., докато страницата вече не е на блога. Естествено вече посетените ще ги пазиш някъде и ще правиш проверка да не се обхождат повторно. И така във всяка страница ще си събира информация за постовете, докато в един момент не се изчерпят всички страници. Тук го има и моментът, че ще изпуснеш страниците, които не са реферирани никъде, но пък и при Гугъл си е така..
За тази техника ти трябва да изпозлваш рекурсия. Ако имаш време и желание, погледни това видео - https://www.youtube.com/watch?v=YP9K7uAzoFA