Модель DOM, .NET и парсинг

Статус
В этой теме нельзя размещать новые ответы.

noobie

Постоялец
Регистрация
4 Мар 2008
Сообщения
102
Реакции
13
Потихоньку осваиваю C# и появляються вопросы.
Вот задумал написать десктопный парсер гугли :)
Впринципе с забором данных и т.д. разобрался. а вот с обработкой не так все просто. Сразу хотел сделать с помощью RegExp. Но потом наткнeлся на такую штуку как DOM. Поставил надстройки для браузера осмотрел тот же гугль и его модель - впринципе то что нужно, там хорошо разложено и структурировано.
А теперь вопрос как в C# работать с DOM HTML страницы?
Если можно небольшой пример обработки.

p.s. извиняюсь за столь сумбурное описание но думаю смысл понятен.
 
Лучше делать свой парсер, что бы был все яден. За час можно написать простиньки вариант.

Котрый просто разбирает теги и аттрибуты.

XmlDocument doc = new XmlDocument();
doc.LoadXml( .... text ....);
XmlElement el1 = doc.DocumentElement["html"];
foreach(XmlNode node1 in el1.ChildNoes){
try{
XmlNode node2 = node1["...tag...."];
....
}
catch(Exception ex){
}
}


типа такими вот коммандами можно xml разбирать.
 
вот про xml то понятно. а вот переход к html какойто ступор :)
теоретически то html это подмножество xml. но как с ним работать чтото не осознаю покаместь.
 
Ты что хочешь, что тебе написали рабочий парсер? если страница написана на XHTML и являеться валидным XML. Тогда тебе поможет только мануал. Ты получаешь какую то ошибку?
 
Парсинг гуглового серпа делается проще.

Для начала посмотри значение переменных в GET запросе на поиск - где то на форуме было. Например замена 'search' на 'ie' - намного легче парсить.
Пример:
Для просмотра ссылки Войди или Зарегистрируйся

Если для скачки страницы ты используешь компонент WebBrowser, то код для парсинга получается вообще простой
Код:
        private string[] ParseGooglePage(HtmlDocument ThePage)    
        {
            List<string> pageurls = new List<string>();
            HtmlElementCollection elementsByTagName = ThePage.GetElementsByTagName("a");

            foreach (HtmlElement element in elementsByTagName)
            {
                string innerHtml = element.InnerHtml;
                if (!element.GetAttribute("href").Contains("google"))
                {
                        pageurls.Add(element.GetAttribute("href"));
                }
            }
            return pageurls.ToArray();
        }

ПС. Если не хочешь использовать этот компонент (который кстати можно сделать невидимым на форме) - можно попробовать WebClient, но тогда действительно придется самому DOM разбирать. Позитив - можно пустить армию WebClient-ов каждый через свою проксю, причем WebClient имеет встроенную многопоточность (метод DownloadStringAsync например).
Короче, тот парсер которым я пользуюсь я на дотнете написал за полчаса.
 
Для поделок подойдет компонент WebBrowser и самодельный парсер. Для более или менее серьезного проекта LibCurl .Net и HTMLParser (я приаттачил их к сообщению). Первая - хороший веб-клиент, второй - мощный парсер HTML, распознающий entity и разные кодировки, да и библиотеки обе фришные
 

Вложения

  • libcurlnet-1_3.zip
    677,4 KB · Просмотры: 16
  • htmlparser.zip
    530,6 KB · Просмотры: 44
юзайте регулярку,
гугл периодически меняет верстку выдачи - будете постоянно исправлять алгоритм разбора DOM-модели, сам с этим сталкивался
 
Кстати, то что я приаттачил в HTMLParser.zip - это SAX парсер. Вы, конечно, если хотите, можете в DOM сохранить html'ку (вручную дерево создать), но особого смысла в этом нет, если не планируете потом по этому дереву бегать туда-сюда в поисках нодов и их ближайших соседей. Для вашей задачи лучше хранить только то, что понадобиться для анализа (например, List с объектом TGoogleLink, в котором хранить анкор и текст...или что там вам понадобится), причем, действительно, если речь только о выдаче гугла, лучше заюзать регэкспы (одним вызовом). К счастью, в .Net они полноценные (System.Text.RegularExpressions).
 
Распарсить выдачу Гугли - webclient и регулярные выражения ........ кода 5 строчек и поменять всегда легко под новую ситуацию (и поисковик)
 
может для парсилки гугла и сойдет курл, но если нужна авторизация, держать сессию и куки, мне кажется webbrowser .нет 2 и выше лучшая альтернатива..хотя для больших проектов наверно тяжелый будет.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху