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

Dmitriy Ka

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

Ахилес

Client
Регистрация
11.11.2020
Сообщения
917
Благодарностей
375
Баллы
63
Поиск по xpath как раз и придумали для быстрого поиска нужных элементов
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
549
Благодарностей
304
Баллы
63

Ахилес

Client
Регистрация
11.11.2020
Сообщения
917
Благодарностей
375
Баллы
63

backoff

Client
Регистрация
20.04.2015
Сообщения
5 930
Благодарностей
6 389
Баллы
113
приведи пример, исходного кода и что надо получить в итоге, лучше всего ссылку на страницу
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
549
Благодарностей
304
Баллы
63
Нет конкретного сайта! Нужно собирать элементы с текстами с любого сайта и взаимодействовать с ними. Поэтому и стоит вопрос, как быстро фильтрануть коллекцию элементов, потому что парсится большое количество.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 930
Благодарностей
6 389
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
5 930
Благодарностей
6 389
Баллы
113
либо нужен пример того что получается спарсить и то что из этого надо получить

короче нужен пример, конкретно, что имеем и что нужно, тогда есть возможность помочь
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
549
Благодарностей
304
Баллы
63
никак, для каждого сайта свой путь парсинга
Можно, вот 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();
 

Ахилес

Client
Регистрация
11.11.2020
Сообщения
917
Благодарностей
375
Баллы
63
Основной вопрос: Как максимально быстро фильтрануть коллекцию HtmlElement c 1000+ элементов?
если задача вот прям вот так стоит.... то никак.
потому что при каждом обращении к элементу el в коллекции, для расчета его координат, происходит обращение к браузеру, а это ну очень долгая операция.
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
549
Благодарностей
304
Баллы
63
Что интересно, все тоже самое у меня очень быстро фильтровало в другом проекте через ZP(10-15 сек, но в VS долго 1.5-2 мин.). А в новом проекте с другой логикой в ZP тоже стало фильтровать очень долго. (магия ZP, даже представления не имею в чем дело :-) )

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

Ахилес

Client
Регистрация
11.11.2020
Сообщения
917
Благодарностей
375
Баллы
63
Что интересно, все тоже самое у меня очень быстро фильтровало в другом проекте через ZP(10-15 сек, но в VS долго 1.5-2 мин.). А в новом проекте с другой логикой в ZP тоже стало фильтровать очень долго. (магия ZP, даже представления не имею в чем дело :-) )

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

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

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

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