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

Тема в разделе "Другие языки", создана пользователем noobie, 15 май 2008.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. noobie

    noobie Постоялец

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

    p.s. извиняюсь за столь сумбурное описание но думаю смысл понятен.
     
  2. n42

    n42

    Регистр.:
    8 фев 2008
    Сообщения:
    206
    Симпатии:
    25
    Лучше делать свой парсер, что бы был все яден. За час можно написать простиньки вариант.

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

    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 разбирать.
     
  3. noobie

    noobie Постоялец

    Регистр.:
    4 мар 2008
    Сообщения:
    103
    Симпатии:
    13
    вот про xml то понятно. а вот переход к html какойто ступор :)
    теоретически то html это подмножество xml. но как с ним работать чтото не осознаю покаместь.
     
  4. n42

    n42

    Регистр.:
    8 фев 2008
    Сообщения:
    206
    Симпатии:
    25
    Ты что хочешь, что тебе написали рабочий парсер? если страница написана на XHTML и являеться валидным XML. Тогда тебе поможет только мануал. Ты получаешь какую то ошибку?
     
  5. Accountboy

    Accountboy Создатель

    Регистр.:
    18 июл 2008
    Сообщения:
    29
    Симпатии:
    10
    Парсинг гуглового серпа делается проще.

    Для начала посмотри значение переменных в 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 например).
    Короче, тот парсер которым я пользуюсь я на дотнете написал за полчаса.
     
  6. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    201
    Симпатии:
    66
    Для поделок подойдет компонент WebBrowser и самодельный парсер. Для более или менее серьезного проекта LibCurl .Net и HTMLParser (я приаттачил их к сообщению). Первая - хороший веб-клиент, второй - мощный парсер HTML, распознающий entity и разные кодировки, да и библиотеки обе фришные
     

    Вложения:

  7. ozware

    ozware

    Регистр.:
    22 апр 2007
    Сообщения:
    327
    Симпатии:
    42
    юзайте регулярку,
    гугл периодически меняет верстку выдачи - будете постоянно исправлять алгоритм разбора DOM-модели, сам с этим сталкивался
     
  8. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    201
    Симпатии:
    66
    Кстати, то что я приаттачил в HTMLParser.zip - это SAX парсер. Вы, конечно, если хотите, можете в DOM сохранить html'ку (вручную дерево создать), но особого смысла в этом нет, если не планируете потом по этому дереву бегать туда-сюда в поисках нодов и их ближайших соседей. Для вашей задачи лучше хранить только то, что понадобиться для анализа (например, List с объектом TGoogleLink, в котором хранить анкор и текст...или что там вам понадобится), причем, действительно, если речь только о выдаче гугла, лучше заюзать регэкспы (одним вызовом). К счастью, в .Net они полноценные (System.Text.RegularExpressions).
     
  9. bobrozavr

    bobrozavr Писатель

    Регистр.:
    14 мар 2008
    Сообщения:
    5
    Симпатии:
    2
    Распарсить выдачу Гугли - webclient и регулярные выражения ........ кода 5 строчек и поменять всегда легко под новую ситуацию (и поисковик)
     
  10. slawek

    slawek Создатель

    Регистр.:
    8 фев 2008
    Сообщения:
    48
    Симпатии:
    11
    может для парсилки гугла и сойдет курл, но если нужна авторизация, держать сессию и куки, мне кажется webbrowser .нет 2 и выше лучшая альтернатива..хотя для больших проектов наверно тяжелый будет.
     
Статус темы:
Закрыта.