пʼятниця, 18 березня 2011 р.

.NET парсер HTML

Стояла задача: вытянуть данные из таблицы в .mht документе.
Сначала подумал решить на C#+Regex, но потом нарыл парсер Html Agility Pack. Спасибо автору:).


Вот как я это сделал:

private void MainForm_Load(object sender, EventArgs e)
{
try
{
var file = @"C:\демпинг.mht";

var contentHex = File.ReadAllText(file, Encoding.GetEncoding(1251));

var content = Regex.Replace(contentHex, @"=[0-9A-F]{2}", m => HexStringToUtf8(m.ToString().Substring(1)));

var doc = new HtmlAgilityPack.HtmlDocument();

doc.LoadHtml(content);

var table = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[1]/table[1]");

if(table == null) throw new Exception("data not found");

var rows = table.SelectNodes("tbody/tr").Skip(1).ToList();

var data = (from r in rows
let tds = r.SelectNodes("td")
select new
{
N = tds[0].InnerText,
Group = tds[1].InnerText,
Product = tds[2].InnerText,
OurPrice = tds[3].InnerText,
AveragePrice = tds[4].InnerText,
Difference = tds[5].InnerText,
DifferencePercent = tds[6].InnerText,
Offers = tds[7].InnerText,
Shops = tds[7].Attributes["title"].Value,
MinPrice = tds[8].InnerText,
MaxPrice = tds[9].InnerText
}).ToList();

grid.DataSource = data;
}
catch(Exception exc)
{
MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private string HexStringToUtf8(string hexString)
{
var bytes = new List();

for(int i = 0; i <= hexString.Length - 2; i += 2)
{
bytes.Add(byte.Parse(hexString.Substring(i, 2), System.Globalization.NumberStyles.HexNumber));
}

var str = Encoding.GetEncoding(1251).GetString(bytes.ToArray());

return str;
}

Результат:

Немає коментарів:

Дописати коментар