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

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

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
951
Реакции
737
Баллы
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
 
Последнее редактирование:
Подскажите, как ускорить фильтрацию коллекции HtmlElements
не использовать HtmlElements :bk:
суть в том, что каждое обращение к коллекции, вызывает обращение к браузеру, а оно нереально долгое.
поэтому для парсинга надо один раз забрать HTML или DOM и уже его распарсить. для этого можно использовать как сторонние dll , так и зенковский метод парсинга xpath из строки, который представлен в виде кубика Парсинг или его аналог в c# коде.
 
не использовать HtmlElements :bk:
суть в том, что каждое обращение к коллекции, вызывает обращение к браузеру, а оно нереально долгое.
поэтому для парсинга надо один раз забрать HTML или DOM и уже его распарсить. для этого можно использовать как сторонние dll , так и зенковский метод парсинга xpath из строки, который представлен в виде кубика Парсинг или его аналог в c# коде.
В дальнейшем нужно будет работать с HtmlElement: кликать, водить мышкой, вставлять значения, получать координаты
 
В дальнейшем нужно будет работать с HtmlElement: кликать, водить мышкой, вставлять значения, получать координаты
тогда модифицируй xpath, что бы меньше находил. так то этот язык довольно мощный для поиска.
 
тогда модифицируй xpath, что бы меньше находил. так то этот язык довольно мощный для поиска.
Тут тоже есть нюанс.:-)
Эмуляция делается не под конкретный сайт, нужен универсальный xPath, который работал бы на большинстве сайтов.
 
Ну, первым делом, я бы посоветовал избавиться от еще одного перебора всех строк.

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

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