Подскажите как быстро фильтрануть большую коллекцию HtmlElements

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
773
Благодарностей
517
Баллы
93
Всем привет, есть задача собрать блоки с текстом HtmlElement со странице(что бы в дальнейшем с ними взаимодействовать через эмуляцию) и очистить его от ненужного хлама.
Пример сайта https://ria.ru/

Написал такой код который с этим справляется, но фильтрует долго
C#:
var result = tab.FindElementsByXPath("//div[text()]")
    .Where(text => text.InnerText.Length > 50)
    .Where(text => text.InnerText.Split('\n').Length < 2)
    .ToList();
Наткнулся на .AsParallel(), но через него результат не выдается
C#:
var asResult = tab.FindElementsByXPath("//div[text()]")
    .AsParallel()
    .Where(text => text.InnerText.Length > 50)
    .Where(text => text.InnerText.Split('\n').Length < 2);
Подскажите, как ускорить фильтрацию коллекции HtmlElements
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
Подскажите, как ускорить фильтрацию коллекции HtmlElements
не использовать HtmlElements :bk:
суть в том, что каждое обращение к коллекции, вызывает обращение к браузеру, а оно нереально долгое.
поэтому для парсинга надо один раз забрать HTML или DOM и уже его распарсить. для этого можно использовать как сторонние dll , так и зенковский метод парсинга xpath из строки, который представлен в виде кубика Парсинг или его аналог в c# коде.
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
773
Благодарностей
517
Баллы
93
не использовать HtmlElements :bk:
суть в том, что каждое обращение к коллекции, вызывает обращение к браузеру, а оно нереально долгое.
поэтому для парсинга надо один раз забрать HTML или DOM и уже его распарсить. для этого можно использовать как сторонние dll , так и зенковский метод парсинга xpath из строки, который представлен в виде кубика Парсинг или его аналог в c# коде.
В дальнейшем нужно будет работать с HtmlElement: кликать, водить мышкой, вставлять значения, получать координаты
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
В дальнейшем нужно будет работать с HtmlElement: кликать, водить мышкой, вставлять значения, получать координаты
тогда модифицируй xpath, что бы меньше находил. так то этот язык довольно мощный для поиска.
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
773
Благодарностей
517
Баллы
93
тогда модифицируй xpath, что бы меньше находил. так то этот язык довольно мощный для поиска.
Тут тоже есть нюанс.:-)
Эмуляция делается не под конкретный сайт, нужен универсальный xPath, который работал бы на большинстве сайтов.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
комбинируй все условия сразу в одно. Мб поможет немного)
 

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 283
Благодарностей
624
Баллы
113
Ну, первым делом, я бы посоветовал избавиться от еще одного перебора всех строк.

C#:
var result = tab.FindElementsByXPath("//div[text()]")
    .Where(text => text.InnerText.Length > 50 && text.InnerText.Split('\n').Length < 2)
    .ToList();
Второй момент. Попробуй так:
C#:
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var tab = instance.ActiveTab;
var a = new List<ZennoLab.CommandCenter.HtmlElement>();
var asResult = tab.FindElementsByXPath("//div[text()]").ToList();
asResult.AsParallel().ForAll(x =>
{
    if (x.InnerText.Length > 50 && x.InnerText.Split('\n').Length < 2)
        a.Add(x);
});

stopwatch.Stop();
TimeSpan elapsedTime = stopwatch.Elapsed;
string formattedTime = string.Format("{0:D2} минут, {1:D2} секунд, {2:D3} миллисекунд",
    elapsedTime.Minutes, elapsedTime.Seconds, elapsedTime.Milliseconds);

project.SendInfoToLog("Время выполнения: " + formattedTime);
 
  • Спасибо
Реакции: Dmitriy Ka

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