Быстрая фильтрация HtmlElement

  • Автор темы Автор темы Dmitriy Ka
  • Дата начала Дата начала

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
951
Реакции
737
Баллы
93
Всем привет!
Есть задача спарсить с сайта элементы с текстом для дальнейшего взаимодействия с элементами. Но парсится большое количество элементов 1000+, в которых находится много лишнего (скрипты, скрытые элементы и т.д.) нужно их отфильтровать. И тут встает проблема, через LINQ очень долго фильтруется коллекция (1.5+ мин.)
Подскажите, как можно быстрей фильтрануть такую большую коллекция (фильтруется по: элемент видимый, ширина и высота > 0, длинна текста > 10)
 
Нет конкретного сайта! Нужно собирать элементы с текстами с любого сайта и взаимодействовать с ними. Поэтому и стоит вопрос, как быстро фильтрануть коллекцию элементов, потому что парсится большое количество.
 
либо нужен пример того что получается спарсить и то что из этого надо получить

короче нужен пример, конкретно, что имеем и что нужно, тогда есть возможность помочь
 
никак, для каждого сайта свой путь парсинга
Можно, вот xPath "//body//*[text()]" который соберёт все элементы с текстом.

либо нужен пример того что получается спарсить и то что из этого надо получить
короче нужен пример, конкретно, что имеем и что нужно, тогда есть возможность помочь
Опишу проблему еще раз. Проблемы с парсингом нет, есть проблема со скоростью фильтрации элементов. Коллекцию фильтрую через LINQ, фильтры: элемент видимый, ширина и высота > 0, длинна текста > 10
Основной вопрос: Как максимально быстро фильтрануть коллекцию HtmlElement c 1000+ элементов?

Пример кода фильтрации
C#:
Развернуть Свернуть Копировать
return elements
    .Where(el => el.IsHidden() != true)// можно убрать
    .Where(el => el.DisplacementInBrowser.Y > 0 && el.DisplacementInBrowser.X > 0)
    .Where(x => x.InnerText.Length > 10)
    .ToList();
 
Основной вопрос: Как максимально быстро фильтрануть коллекцию HtmlElement c 1000+ элементов?
если задача вот прям вот так стоит.... то никак.
потому что при каждом обращении к элементу el в коллекции, для расчета его координат, происходит обращение к браузеру, а это ну очень долгая операция.
 
Что интересно, все тоже самое у меня очень быстро фильтровало в другом проекте через ZP(10-15 сек, но в VS долго 1.5-2 мин.). А в новом проекте с другой логикой в ZP тоже стало фильтровать очень долго. (магия ZP, даже представления не имею в чем дело :-) )

Скорей всего здесь поможет асинхронность, но я пока с ней не дружу. То есть, пока фильтруются элементы, мы делаем что-то более простое на сайте, а потом начинаем взаимодействовать с элементами текста.
 
Что интересно, все тоже самое у меня очень быстро фильтровало в другом проекте через ZP(10-15 сек, но в VS долго 1.5-2 мин.). А в новом проекте с другой логикой в ZP тоже стало фильтровать очень долго. (магия ZP, даже представления не имею в чем дело :-) )

Скорей всего здесь поможет асинхронность, но я пока с ней не дружу. То есть, пока фильтруются элементы, мы делаем что-то более простое на сайте, а потом начинаем взаимодействовать с элементами текста.
не советую терять время на эти эксперементы...
так как процедура получения данных из браузера, очень долгая по времени, то в коллекцию HtmlElementCollection складываются ссылочные объекты HtmlElement, которые не имеют внутри себя реальных данных, а только ссылку на объект в браузере.
они там появляются только при явном обращении к элементу, и это занимает очень много времени.

суть в том, что если на странице в браузере хоть что то измениться после формирования HtmlElementCollection , то автоматически все ссылки в ней, признаются недействительными и получить данные по ним не получится.

вам скорее всего необходимо в корне пересмотреть задачу по парсингу. например парсить данные из HTML кода, а не из браузера. фильтровать по длине текста, формируя список номеров нужных элементов, и уже потом парсить из браузера, обходя только нужные элементы по номерам из списка. фиг знает насколько уменьшится колличество элементов, но все же.
 
  • Оценить
Реакции: Dmitriy Ka

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)