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

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
733
Благодарностей
485
Баллы
63
Всем привет, есть задача собрать блоки с текстом 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 790
Благодарностей
5 720
Баллы
113
Подскажите, как ускорить фильтрацию коллекции HtmlElements
не использовать HtmlElements :bk:
суть в том, что каждое обращение к коллекции, вызывает обращение к браузеру, а оно нереально долгое.
поэтому для парсинга надо один раз забрать HTML или DOM и уже его распарсить. для этого можно использовать как сторонние dll , так и зенковский метод парсинга xpath из строки, который представлен в виде кубика Парсинг или его аналог в c# коде.
 

Dmitriy Ka

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

Phoenix78

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

Dmitriy Ka

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

doc

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

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 237
Благодарностей
573
Баллы
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)