Вопрос

Я хочу разработать веб-скребок в C # window forms.То, чего я пытаюсь добиться, заключается в следующем:

  1. Получите URL-адрес от пользователя.
  2. Загрузите веб-страницу в элементе управления пользовательским интерфейсом IE (встроенный браузер) в WinForms.
  3. Разрешить пользователю выделять текст (непрерывный, небольшого размера (не более 50 символов)).с загруженной веб-страницы.
  4. Когда пользователь желает сохранить местоположение (расположение HTML DOM) он должен быть сохранен в базе данных, чтобы пользователь мог использовать это местоположение для извлечения данных из этого местоположения во время своих последующих посещений.

Предположим, что загруженный веб-сайт является сайтом с прейскурантом и указанная стоимость продолжает меняться, идея состоит в том, чтобы сохранить иерархию DOM, чтобы я мог просмотреть ее в следующий раз.

Я был бы в состоянии сделать это, если бы все HTML-элементы имели свои атрибуты id.В случае , когда идентификатор равен нулю , я не в состоянии выполнить это .

Может ли кто-нибудь предложить правильную идею по этому поводу (минимальный фрагмент кода, если возможно).?

Это было бы полезно, даже если бы вы могли поделиться некоторыми онлайн-ресурсами.

Спасибо,

виджай

Это было полезно?

Решение

Один из подходов — создать стек тегов/стилей/идентификаторов до элемента, который вы хотите выбрать.

От нужного элемента перейдите к ближайшему элементу id.Таким образом вы избавитесь от большей части верхнего заголовка и т. д.Затем постройте последовательность для поиска.

Пример:

<html>
  <body>
    <!-- lots of html -->
    <div id="main">
       <div>
          <span>
             <div class="pricearea">
                <table> <!-- with price data -->

Например, вы должны сохранить в своей базе данных последовательность: [id=main],div,span,div,table или возможно div[класс=ценовая область],таблица.

Использование стилей/классов также может использоваться для создания вашего пути.Вы можете выбирать: искать тег, атрибут тега или их комбинацию.Вам нужно, чтобы он был максимально точным и содержал как можно меньше элементов, чтобы сделать его надежным.

Если макет редко меняется, это позволит вам каждый раз переходить к одному и тому же месту.

Я бы также посоветовал вам использовать Пакет гибкости HTML или что-то подобное для анализа DOM, поскольку управление IE работает медленно.

Скрапинг экрана — это весело, но добиться 100%-ной точности для всех страниц сложно.Удачи!

Другие советы

Немного погуглив , я наткнулся на довольно простое решение .Ниже прилагается примерный фрагмент текста.

if (webBrowser.Document != null)
        {
            IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;// loads the HTML DOM
            IHTMLSelectionObject selection = HtmlDoc.selection;// Fetches the currently selected HTML Element.
            IHTMLTxtRange range = (IHTMLTxtRange)selection.createRange();
            IHTMLElement parentElement = range.parentElement();// Identifies the parent element
            targetSourceIndex = parentElement.sourceIndex;               
            //dataLocation = range.parentElement().id;                
            MessageBox.Show(range.text);//range.parentElement().sourceIndex
        }

Я использовал Встроенный веб-браузер в приложении Winforms, которое загружает HTML DOM текущей веб-страницы.

Тот Самый IHTMLЭлемент экземпляр предоставляет свойство с именем 'SourceIndex', которое присваивает уникальный идентификатор каждому из html-элементов.

Можно сохранить этот SourceIndex в базе данных и запросить содержимое в этом месте.используя следующий код.

if (webBrowser.Document != null)
            {
                IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;
                IHTMLElement targetElement = null;
                foreach (IHTMLElement domElement in HtmlDoc.all)
                {
                    if (domElement.sourceIndex == int.Parse(node.InnerText))// fetching the persisted data from the XML file.
                    {
                        targetElement = domElement;
                        break;
                    }
                }

                MessageBox.Show(targetElement.innerText); //range.parentElement().sourceIndex
            }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top