Сначала подумал решить на 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;
}
Результат:
Немає коментарів:
Дописати коментар