Comments 24
Расскажите об анализе данных на странице. Допустим поиск нерегулярного шаблона, например, цены на страницах разных интернет-магазинов с неизвестной структурой dom дерева.
Открываю FireBug, смотрю что где. Запоминаю нужный элемент либо по id либо по классу либо по позиции. Выдираю этот кусочек HTML, смотрю well-formed или нет. Корректирую ошибки, делаю мэппинг. Ну и дальше все как обычно.
с неизвестной структурой dom дерева
ну обобщенным поиском я вообще не занимаюсь. это затратно, и если информация не структурирована, вы просто теряете время.
а тот, кто сможет не теряя время структурировать получает — profit)
мне кажется что задача о которой вы говорите решается совершенно иными способами чем описано в статье
например таким — habrahabr.ru/blogs/artificial_intelligence/93641/
например таким — habrahabr.ru/blogs/artificial_intelligence/93641/
все что дает компания Microsoft в .Net для XSLT – настоящее убожествоМожно поподробнее, в чём убогость? Недавно кидал распарсенные данные в SQL-дамп через XSLT — всё было в порядке.
А для того чтобы замапить валидный XML в структуру данных достаточно воспользоваться LINQ to XML и не городить кучу платных инструментов. Ну да, нужно .NET 3.5.
Убогость в двух вещах: плохой поддержке XSLT и отсутствия поддержки XQuery. Мне кажется очень плохо что этого нет в .Net-е.
Да, мапить можно через Linq to XML. Да можно вообще вручную через XPath от HTML Agility Pack. Но я так не делаю т.к. мне нужно более организованно управлять мэппингами, быстро реагировать на изменения и по возможности сохранять накопленный ноу-хау.
Да, мапить можно через Linq to XML. Да можно вообще вручную через XPath от HTML Agility Pack. Но я так не делаю т.к. мне нужно более организованно управлять мэппингами, быстро реагировать на изменения и по возможности сохранять накопленный ноу-хау.
Ну так я и пытаюсь выяснить у вас, в чём заключается плохая поддержка XSLT в .NET. А то может я чего-то не знаю :)
мне нужно более организованно управлять мэппингами, быстро реагировать на измененияОпять не понял. Много красивых слов вижу, сути не вижу. Вы вообще LINQ пользовались? Вместо того, чтобы написать элементарный код, чрезвычайно похожий (внимание!) на XQuery, вы городите преобразование CLR в XSD, потом прогоняете это через сторонний XSLT-парсер при этом пишете в статье в каждом абзаце какой это геморрой. А всего-то и надо, что заполнить данными экземпляр класса. Может быть я всё-таки немного не понимаю, чего вы хотите добиться, но навскидку — LINQ тут был бы идеальным и бескровным решением.
В .Net-овом XSLT не поддерживается очень много функций и фич, без которых в XSLT играть неинтересно.
Да, я знаю что можно использовать LINQ. Но мэппинг — это серьезное, промышленное решение, а не быстрая отписка. Мэппинги себя окупают, да и создание их никаких проблем не вызывает.
Да, я знаю что можно использовать LINQ. Но мэппинг — это серьезное, промышленное решение, а не быстрая отписка. Мэппинги себя окупают, да и создание их никаких проблем не вызывает.
А вот бесплатная штука для трансформации данных — www.talend.com
Мощная и удобная!
Мощная и удобная!
Занимался написанием грабберов сайтов, с последующим парсингом содержимого. Могу посоветовать следующий код который нравится лично мне:
В итоге получим XML документ, с которым приятно работать.
public static XmlDocument LoadFromUrlAsXML(string url, CookieContainer contayner)
{
using (SgmlReader reader = new SgmlReader { InputStream = new StringReader(CleanString(WebDownloader.GetString(EncodeCyrUrl(url), null, (byte[])null, contayner))) })
{
if (!url.Contains("://")) url = String.Format("http://{0}", url);
XmlDocument doc = new XhtmlDocument(reader.NameTable);
doc.Load(reader);
reader.Close();
return doc;
}
}
* This source code was highlighted with Source Code Highlighter.
В итоге получим XML документ, с которым приятно работать.
То есть вы хотите сказать что если документ по Url плохо сформирован то связка SgmlReader-XhtmlDocument его выправят?
Есть немного=)
/// <summary>
/// Используется чтобы оставить только содержимое HTML части, для более удобного приведения к XML виду
/// </summary>
private static string CleanString(string str)
{
return str.Substring(str.IndexOf("<html", StringComparison.OrdinalIgnoreCase), str.IndexOf("</html>", StringComparison.OrdinalIgnoreCase) - str.IndexOf("<html", StringComparison.OrdinalIgnoreCase) + 6);
}
* This source code was highlighted with Source Code Highlighter.
Лично я всегда пользовался watin-ом для подобных целей. watin.sourceforge.net/
Возможно немного не то (открывается окно браузера), но быстро используемое и очень удобное средство
Возможно немного не то (открывается окно браузера), но быстро используемое и очень удобное средство
mezastel, спасибо! интересный обзор
mezastel, а для валидации данных в xml по определенным правилам что используете? (минимальная длинна строки, дата в будущем итд)
Sign up to leave a comment.
Data acquisition, часть 2