Нужна помощь по xpatch

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18
Необходимо со страницы вконтакте (только в дальнейшем страницы будут разные) выгрузить определенные контейнеры и найти в них определенное значение! Отблагодарю!
Вот страница вк: https://vk.com/maksim_help
Мне нужно собрать с нее "Личная информация", регуляркой тут не прокатывает так как некоторые блоки имеют одинаковые теги, а мне необходимо знать с какого именно блока я спрасил текст.

Т.е вот эти блоки:
2017-07-17_21-30-55 (2).png

Я понимаю что можно взять регуляркой по порядку, но профили вконтакте будут меняться и некоторые блоки могут отсутствовать!
Мне необходимо знать что и откуда я взял: К примеру блок "Интересы" взять с него текст (в данном случае слово "Футбол" и так с каждого блока.

Было бы отлично если бы сохранялось сразу в текстовый документ названием которого был блок (к примеру "Интересы") а внутри текстовика находилось значение взятое из блока ( в данном случае слово "Футбол")

Попытался объяснить как смог( Не судите строго!
Если кто-то согласен сделать за определенную плату - Я СОГЛАСЕН!
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Регуляркой вполне можно цепляться за заголовки типа "о себе" или "интересы". А вот как раз xpath и поломает тебе всё, когда встретится ситуация, когда
профили вконтакте будут меняться и некоторые блоки могут отсутствовать!
 

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18
Регуляркой вполне можно цепляться за заголовки типа "о себе" или "интересы". А вот как раз xpath и поломает тебе всё, когда встретится ситуация, когда
Скинь пример регулярки, я как только не пытался она не находит(
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
А вот как раз xpath и поломает тебе всё, когда встретится ситуация, когда
Что-либо сломать со стороны шаблона могут только кривые пути (так же, как и кривые регулярки), поэтому не стоит так к данному инструменту.
Необходимо со страницы вконтакте (только в дальнейшем страницы будут разные) выгрузить определенные контейнеры и найти в них определенное значение!
Можно использовать например такой код. Из сниппета возвращаться будет текст того блока, название которого указано в первой строке (н-р "Интересы:", "Любимые книги:")
C#:
string block = "Интересы:";    //Точное имя контейнера
//Возвращаем результат
return instance.ActiveTab.FindElementByXPath("//div[text()='"+block+"']/following-sibling::div",0).InnerText;
 
  • Спасибо
Реакции: justhelen и orka13

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18
Что-либо сломать со стороны шаблона могут только кривые пути (так же, как и кривые регулярки), поэтому не стоит так к данному инструменту.

Можно использовать например такой код. Из сниппета возвращаться будет текст того блока, название которого указано в первой строке (н-р "Интересы:", "Любимые книги:")
C#:
string block = "Интересы:";    //Точное имя контейнера
//Возвращаем результат
return instance.ActiveTab.FindElementByXPath("//div[text()='"+block+"']/following-sibling::div",0).InnerText;
Меняю имя контейнера на любое другое и уже не работает( что не так?
Под каждый контейнер можете сделать?
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
Меняю имя контейнера на любое другое и уже не работает( что не так?
Под каждый контейнер можете сделать?
Точно правильно название контейнера пишете? Двоеточие не забываете? Если нет, приведите пример кода с другим названием контейнера, который не работает.
У меня всё работает, проверил на двух страницах.
 

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18
Точно правильно название контейнера пишете? Двоеточие не забываете? Если нет, приведите пример кода с другим названием контейнера, который не работает.
У меня всё работает, проверил на двух страницах.
Все работает! Спасибо вам огромное! Очень мне помогли!
 

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18
Что-либо сломать со стороны шаблона могут только кривые пути (так же, как и кривые регулярки), поэтому не стоит так к данному инструменту.

Можно использовать например такой код. Из сниппета возвращаться будет текст того блока, название которого указано в первой строке (н-р "Интересы:", "Любимые книги:")
C#:
string block = "Интересы:";    //Точное имя контейнера
//Возвращаем результат
return instance.ActiveTab.FindElementByXPath("//div[text()='"+block+"']/following-sibling::div",0).InnerText;
Прошу прощения за то, что опять Вас беспокою( В интернете не смог найти ответа! Как вместо текста взять сам html код этого блока?
Как я понимаю надо заменить слово text на что то?
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
Как вместо текста взять сам html код этого блока?
Как я понимаю надо заменить слово text на что то?
Да, достаточно обратиться к свойству InnerHtml вместо InnerText.
C#:
return instance.ActiveTab.FindElementByXPath("//div[text()='"+block+"']/following-sibling::div",0).InnerHtml;
 

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18
Да, достаточно обратиться к свойству InnerHtml вместо InnerText.
C#:
return instance.ActiveTab.FindElementByXPath("//div[text()='"+block+"']/following-sibling::div",0).InnerHtml;
Снова нужна ваша помощь! Если можно с вами связаться напрямую, то пришлите пожалуйста контакты! В xpatch я полный ноль и нихрена ничего не понимаю( Я вам заплачу за помощь!
Сейчас такая проблема:
Необходимо спарсить пост со страницы вконтакте! Необходимо чтобы парсился текст поста и фотографии (их может быть несколько, а может и не быть), а также ссылки (их может быть несколько, а может и не быть)! Если трудоемко, готов оплатить тому, кто выполнит задачу)
Пример поста на этой страницы вконтакте: https://vk.com/maksim_help Самый первый пост на стене!

Мне дали такой вариант: //*[@id="wpt180262073_179"] но как это прописать и вернуть значение???
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
Необходимо спарсить пост со страницы вконтакте! Необходимо чтобы парсился текст поста и фотографии (их может быть несколько, а может и не быть), а также ссылки (их может быть несколько, а может и не быть)! Если трудоемко, готов оплатить тому, кто выполнит задачу)
Пример поста на этой страницы вконтакте: https://vk.com/maksim_help Самый первый пост на стене!

Мне дали такой вариант: //*[@id="wpt180262073_179"] но как это прописать и вернуть значение???
Путь //*[@id="wpt180262073_179"] - на весь пост целиком. Нужно также учитывать, что этот путь зависим от ID странички и ID поста.
Саму задачу, если цепляться за такой путь, можно решить следующим образом:
C#:
int pageID = 180262073;    //ID странички
int postID = 179;    //ID поста на страничке

//Ищем пост по ID
var post = instance.ActiveTab.FindElementByXPath("//*[@id='wpt"+pageID+"_"+postID+"']",0);

//Ищем элемент с текстом поста
var text = post.FindChildByXPath(".//*[@class='wall_post_text']",0);
//Помещаем найденный текст в переменную проекта 'text_posta' (вместе с html-кодом смайлов и ссылок)
project.Variables["text_posta"].Value = text.InnerHtml;

//Ищем ссылки в тексте поста
var colLinks = text.FindChildrenByXPath(".//a");
//Если ссылки есть
if (colLinks.Count>0){
    foreach (var link in colLinks.Elements){
        //Помещаем в список все найденные ссылки
        project.Lists["Список ссылок"].Add(link.GetAttribute("InnerHtml"));
        //Если указать "InnerHtml" - вернется текст ссылки (https://yandex.ru/)
        //Если указать "href" - вернется ссылка вида https://vk.com/away.php?to=https%3A%2F%2Fyandex.ru%2F&post=180262073_179&cc_key=
    }
}

//Ищем фотографии (ссылки на фото)
var colPhotos = post.FindChildrenByXPath(".//a[contains(@href,'/photo')]");
//Если фото есть
if (colPhotos.Count>0){
    foreach (var photo in colPhotos.Elements){
        //Находим ссылку
        string phLink = photo.GetAttribute("style");
        phLink = phLink.Substring(phLink.IndexOf('(')+1).Replace(")","");
        //Помещаем в список все найденные ссылки на фото
        project.Lists["Список ссылок фото"].Add(phLink);
    }
}
PS: для работы кода в проекте должны быть: переменная text_posta, список "Список ссылок", список "Список ссылок фото". Либо нужно поменять эти названия на свои.
 

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18
Путь //*[@id="wpt180262073_179"] - на весь пост целиком. Нужно также учитывать, что этот путь зависим от ID странички и ID поста.
Саму задачу, если цепляться за такой путь, можно решить следующим образом:
C#:
int pageID = 180262073;    //ID странички
int postID = 179;    //ID поста на страничке

//Ищем пост по ID
var post = instance.ActiveTab.FindElementByXPath("//*[@id='wpt"+pageID+"_"+postID+"']",0);

//Ищем элемент с текстом поста
var text = post.FindChildByXPath(".//*[@class='wall_post_text']",0);
//Помещаем найденный текст в переменную проекта 'text_posta' (вместе с html-кодом смайлов и ссылок)
project.Variables["text_posta"].Value = text.InnerHtml;

//Ищем ссылки в тексте поста
var colLinks = text.FindChildrenByXPath(".//a");
//Если ссылки есть
if (colLinks.Count>0){
    foreach (var link in colLinks.Elements){
        //Помещаем в список все найденные ссылки
        project.Lists["Список ссылок"].Add(link.GetAttribute("InnerHtml"));
        //Если указать "InnerHtml" - вернется текст ссылки (https://yandex.ru/)
        //Если указать "href" - вернется ссылка вида https://vk.com/away.php?to=https%3A%2F%2Fyandex.ru%2F&post=180262073_179&cc_key=
    }
}

//Ищем фотографии (ссылки на фото)
var colPhotos = post.FindChildrenByXPath(".//a[contains(@href,'/photo')]");
//Если фото есть
if (colPhotos.Count>0){
    foreach (var photo in colPhotos.Elements){
        //Находим ссылку
        string phLink = photo.GetAttribute("style");
        phLink = phLink.Substring(phLink.IndexOf('(')+1).Replace(")","");
        //Помещаем в список все найденные ссылки на фото
        project.Lists["Список ссылок фото"].Add(phLink);
    }
}
PS: для работы кода в проекте должны быть: переменная text_posta, список "Список ссылок", список "Список ссылок фото". Либо нужно поменять эти названия на свои.

Как я могу вас отблагодарить?
 

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
204
Благодарностей
7
Баллы
18
Путь //*[@id="wpt180262073_179"] - на весь пост целиком. Нужно также учитывать, что этот путь зависим от ID странички и ID поста.
Саму задачу, если цепляться за такой путь, можно решить следующим образом:
C#:
int pageID = 180262073;    //ID странички
int postID = 179;    //ID поста на страничке

//Ищем пост по ID
var post = instance.ActiveTab.FindElementByXPath("//*[@id='wpt"+pageID+"_"+postID+"']",0);

//Ищем элемент с текстом поста
var text = post.FindChildByXPath(".//*[@class='wall_post_text']",0);
//Помещаем найденный текст в переменную проекта 'text_posta' (вместе с html-кодом смайлов и ссылок)
project.Variables["text_posta"].Value = text.InnerHtml;

//Ищем ссылки в тексте поста
var colLinks = text.FindChildrenByXPath(".//a");
//Если ссылки есть
if (colLinks.Count>0){
    foreach (var link in colLinks.Elements){
        //Помещаем в список все найденные ссылки
        project.Lists["Список ссылок"].Add(link.GetAttribute("InnerHtml"));
        //Если указать "InnerHtml" - вернется текст ссылки (https://yandex.ru/)
        //Если указать "href" - вернется ссылка вида https://vk.com/away.php?to=https%3A%2F%2Fyandex.ru%2F&post=180262073_179&cc_key=
    }
}

//Ищем фотографии (ссылки на фото)
var colPhotos = post.FindChildrenByXPath(".//a[contains(@href,'/photo')]");
//Если фото есть
if (colPhotos.Count>0){
    foreach (var photo in colPhotos.Elements){
        //Находим ссылку
        string phLink = photo.GetAttribute("style");
        phLink = phLink.Substring(phLink.IndexOf('(')+1).Replace(")","");
        //Помещаем в список все найденные ссылки на фото
        project.Lists["Список ссылок фото"].Add(phLink);
    }
}
PS: для работы кода в проекте должны быть: переменная text_posta, список "Список ссылок", список "Список ссылок фото". Либо нужно поменять эти названия на свои.

Блин если ставлю вместо номера ID и номера POST переменные то выдает ошибку(

Код:
int pageID = project.Variables["id"].Value;    //ID странички
int postID = project.Variables["nomer_post"].Value;    //ID поста на страничке
//Ищем пост по ID
var post = instance.ActiveTab.FindElementByXPath("//*[@id='wpt"+pageID+"_"+postID+"']",0);
//Ищем элемент с текстом поста
var text = post.FindChildByXPath(".//*[@class='wall_post_text']",0);
//Помещаем найденный текст в переменную проекта 'text_posta' (вместе с html-кодом смайлов и ссылок)
project.Variables["text_posta"].Value = text.InnerHtml;
//Ищем ссылки в тексте поста
var colLinks = text.FindChildrenByXPath(".//a");
//Если ссылки есть
if (colLinks.Count>0){
    foreach (var link in colLinks.Elements){
        //Помещаем в список все найденные ссылки
        project.Lists["Список ссылок"].Add(link.GetAttribute("InnerHtml"));
        //Если указать "InnerHtml" - вернется текст ссылки (https://yandex.ru/)
        //Если указать "href" - вернется ссылка вида https://vk.com/away.php?to=https%3A%2F%2Fyandex.ru%2F&post=180262073_179&cc_key=
    }
}
//Ищем фотографии (ссылки на фото)
var colPhotos = post.FindChildrenByXPath(".//a[contains(@href,'/photo')]");
//Если фото есть
if (colPhotos.Count>0){
    foreach (var photo in colPhotos.Elements){
        //Находим ссылку
        string phLink = photo.GetAttribute("style");
        phLink = phLink.Substring(phLink.IndexOf('(')+1).Replace(")","");
        //Помещаем в список все найденные ссылки на фото
        project.Lists["Список ссылок фото"].Add(phLink);
    }
}
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
Блин если ставлю вместо номера ID и номера POST переменные то выдает ошибку(
Нужно сменить тип переменных:
C#:
string pageID = project.Variables["id"].Value;    //ID странички
string postID = project.Variables["nomer_post"].Value;    //ID поста на страничке
Как я могу вас отблагодарить?
Проверьте личку, писал на всякий случай по контактам.
 

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