Помогите составить сниппет чтения элемента в цикле

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
Помогите составить сниппет, плиз.
Нужно прочитать весь текст, который находится в тегах <p>...</p>

проблема в том что на сайте много текста и он разбит
то есть, выглядит это так

<p>...</p>
<p>...</p>
картинка
<p>...</p>
<p>...</p>
и тп

для чтения (эмуляции мышки) использую этот сниппет
C#:
Tab tab = instance.ActiveTab;
var rnd = new Random();

//Ищем заголовок поста
    var h2 = tab.FindElementByXPath(".//p",0);
    //Проводим мышкой по заголовку, для второго параметра используем рандом (например, от 30 до 50)
    tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
сниппет читает только первый тег и все.
как сделать чтобы он читал, первый, потом второй, если надо проматывал и читал дальше?
помогите заапгрейдить
спасибо

пример сайта с таким разбитием http://dietatani.ru/kapusta-dlya-pohudeniya можно на не потренироваться сделать чтение)


рабочий варик - https://zennolab.com/discussion/threads/pomogite-sostavit-snippet-chtenija-ehlementa-v-cikle.66088/post-464044

рабочий варик, если надо прочитать больше 1 элемента -
 
Последнее редактирование:

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Это для накрутки ПФ что ли?
C#:
HTMLCollection hs = tab.FindElementsByXPath(".//p");
for (int i = 0; i < hs.Count; i++) {
var h2 = tab.FindElementByXPath(".//p",i);
tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
}
Примерно так, писал по памяти, могут быть ошибки.
 

backoff

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

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
выдает такое

C#:
Тип    Время    Сообщение
    15:27:01    Компиляция кода  Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "HTMLCollection" (пропущена директива using или ссылка на сборку?)". [Строка: 3; Cтолбец: 1]
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
рабочий варик

Код:
Tab tab = instance.ActiveTab;
var rnd = new Random();

var h1 = tab.FindElementsByXPath(".//p");
for (int i = 0; i < h1.Count; i++) {
var h2 = tab.FindElementByXPath(".//p",i);
tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
}
 
  • Спасибо
Реакции: Mazamaka

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
@Astraport подскажи, чето читать все слишком долго получается :-)
Как ввести ограничение чтоб читал например 10 блоков, а не все 30

ну то есть, если h1.Count больше 10, то делаем 10
если меньше, то делаем все
 
Последнее редактирование:

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
186
Баллы
43
Это для накрутки ПФ что ли?
C#:
HTMLCollection hs = tab.FindElementsByXPath(".//p");
for (int i = 0; i < hs.Count; i++) {
var h2 = tab.FindElementByXPath(".//p",i);
tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
}
Примерно так, писал по памяти, могут быть ошибки.
C#:
Random rnd = new Random();
Tab tab = instance.ActiveTab;
HtmlElementCollection hs = tab.FindElementsByXPath(".//p");
for (int i = 0; i < hs.Count; i++) {
var h2 = tab.FindElementByXPath(".//p",i);
tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
}
в таком варианте работает, проверил только что. Но есть одно но - долго читает всю страницу. Как вариант, надо сначала получить общее число hs.Count и разделить его на 2/3/4, а потом уже использовать этот вариант, чтобы быстрее проходил страницу. Либо - при прохождении каждого цикла прибавлять не один, а два, к примеру.
 

kapelan28

Client
Регистрация
22.09.2015
Сообщения
469
Благодарностей
186
Баллы
43
Как ввести ограничение чтоб читал например 10 блоков, а не все 30
C#:
Random rnd = new Random();
Tab tab = instance.ActiveTab;
HtmlElementCollection hs = tab.FindElementsByXPath(".//p");
if (hs.Count<= 10) {
for (int i = 0; i < hs.Count; i++) {
var h2 = tab.FindElementByXPath(".//p",i);
tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
}
} else {
for (int i = 0; i < hs.Count; i++) {
var h2 = tab.FindElementByXPath(".//p",i+(rnd.Next(1,4)));
tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(20,30));
}
    }
это как вариант
 
  • Спасибо
Реакции: backoff

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
рабочий варик

C#:
Random rnd = new Random();
Tab tab = instance.ActiveTab;
HtmlElementCollection hs = tab.FindElementsByXPath(".//p");
if (hs.Count<= 10) {
for (int i = 0; i < hs.Count; i++) {
var h2 = tab.FindElementByXPath(".//p",i);
tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
}
} else {
for (int i = 0; i < 10; i++) {
var h2 = tab.FindElementByXPath(".//p",i);
tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(20,30));
}
    }
спасибо за помощь
 
  • Спасибо
Реакции: Dorian_Gray и kapelan28

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Так не надо делать) Делать так:
C#:
Random rnd = new Random();
Tab tab = instance.ActiveTab;
HtmlElementCollection hs = tab.FindElementsByXPath(".//p");
int max = (hs.Count < 10) ? hs.Count:10;
for (int i = 0; i < max; i++) {
  var h2 = tab.FindElementByXPath(".//p",i);
  tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(20,30));
}
 

backoff

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

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
Не понимаю, зачем столько раз парсить страницу? Получили коллекцию и прошлись по ней. Вы чего, ребята? :-)
C#:
Random rnd = new Random();
Tab tab = instance.ActiveTab;
HtmlElementCollection hs = tab.FindElementsByXPath(".//p");
int max = (hs.Count < 10) ? hs.Count:10;
for (int i = 0; i < max; i++) {
  var h2 = hs.ElementAt(i);
  tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(20,30));
}
 
  • Спасибо
Реакции: Astraport

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
в чем собственно отличие, от снипа Астры?
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
в чем собственно отличие, от снипа Астры?
Ну если ты посмотришь внимательно на эти 2 сниппета и прочитаешь внимательно, что Я перед снипетом написал, то, возможно, увидишь отличие.
В исходном сниппете из коллекции только количество элементов коллекции используется, и в каждой итерации цикла снова парсим страницу и ищем элемент с порядковым номером.
В моём варианте 1 раз парсим страницу и берём элементы уже из неё. Есть разница?
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
у если ты посмотришь внимательно на эти 2 сниппета и прочитаешь внимательно, что Я перед снипетом написал
да, я значит правильно понял, что твой сниппет делает меньше действий.
извини, чукча не местный, сишарпы читать не умеет, поэтому и просит пояснений :-)
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
а вот и ошибки

C#:
Тип    Время    Сообщение
    11:49:14    "Выполнение действия CSharp OwnCode: читаем текст. Заданный аргумент находится вне диапазона допустимых значений.
Имя параметра: index"
тестил на этой странице - https://bigpicture.ru/?p=894902
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

backoff

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

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

backoff

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

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
бля ну реально, ну сколько можно повторять я чукча в шарпе, звиздец, трудно обернутое запостить?
похуй, твой первый варик работает норм

Как вариант
C#:
Random rnd = new Random();
Tab tab = instance.ActiveTab;
HtmlElementCollection hs = tab.FindElementsByXPath(".//p");
int limit = 3;//Сколько блоков нужно "читать", если они есть
int max = (hs.Count > limit) ? limit:hs.Count;
for (int i = 0; i < max; i++) {
  var h2 = hs.ElementAt(i);
  tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(20,30));
}
 
  • Спасибо
Реакции: backoff

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
бля ну реально, ну сколько можно повторять я чукча в шарпе, звиздец, трудно обернутое запостить?
Я просто не знаю в каком месте кода у тебя ошибка. Предположу что не находит элемент.
Поэтому можно так без try-catch:
C#:
Random rnd = new Random();
Tab tab = instance.ActiveTab;
HtmlElementCollection hs = tab.FindElementsByXPath(".//p");
int max = (hs.Count < 10) ? hs.Count:10;
for (int i = 0; i < max; i++) {
  var h2 = hs.ElementAt(i);
 if (h2.IsVoid) return null;
  tab.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(20,30));
}
Если не найдет элемент выйдет по красной ветке, а ты соедини её со следующим кубиком.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
Это глюки зеннопостера при работе с коллекцией элементов html, замечаю не первый раз. Потому как логика верна.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Это глюки зеннопостера при работе с коллекцией элементов html, замечаю не первый раз. Потому как логика верна.
Не. Просто ElementAt создан для чего-то другого. Там нужно использовать другой метод
 
  • Спасибо
Реакции: Metrix

backoff

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

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
  • Спасибо
Реакции: backoff

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
только в споре рождается истина :-)
надо сделать самый лучший вариант и чтоб работал :-)

астрыч тебе тоже спасибо, если ты об этом... мы ж тут все за одно так сказать
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63

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