xpath в zp для незнающих c#

PaCHeR

Client
Регистрация
08.03.2016
Сообщения
10
Благодарностей
0
Баллы
1
Всем привет. Хочу перевести скрипт с регулярок на xpath но не знаю основ c# и времени к сожалению особо нет изучать.
Можете кратко рассказать как составлять код чтобы элементарно в одном экшене искалось одно значение xpath и отправлялось в нужную переменную.
К примеру нужно из кода страницы который находится в переменной pagedom вытащить значение по пути h1. И положить в переменную HH1. Что нужно написать в коде?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Кратко и быстро это только за денежку :-). Расширь ТЗ: шаблона на браузере или POST\GET?
Если первое, то тема для новичков здесь хорошая - http://zennolab.com/discussion/threads/obzor-zennoposter-xpath-na-primere-jandeks-marketa.37497/
Если второе, то примерочной шаблон и инфа в этом посте - http://zennolab.com/discussion/threads/ispolzovanie-xpath-na-chistom-html.40267/#post-299467
Если очень ленивый, то скинь код страницы сюда (pagedom), сделаю сам.
 
Последнее редактирование:
  • Спасибо
Реакции: PaCHeR и zortexx

Sobesednic

Client
Регистрация
24.12.2012
Сообщения
391
Благодарностей
77
Баллы
28

PaCHeR

Client
Регистрация
08.03.2016
Сообщения
10
Благодарностей
0
Баллы
1
Кратко и быстро это только за денежку :-). Расширь ТЗ: шаблона на браузере или POST\GET?
Если первое, то примерочной шаблон и инфа в этом посте - http://zennolab.com/discussion/threads/ispolzovanie-xpath-na-chistom-html.40267/#post-299467
Если второе, то тема для новичков здесь хорошая - http://zennolab.com/discussion/threads/obzor-zennoposter-xpath-na-primere-jandeks-marketa.37497/
Если очень ленивый, то скинь код страницы сюда (pagedom), сделаю сам.
Я не очень ленивый, просто с языками всё сложно у меня( Поэтому и пользуюсь зенкой)
Что нужно. Есть страница с товаром. Вот ссылка: http://hotline.ua/adult-pepelnicy/brasstico-4114/discussion/

Кусок кода страницы:
Код:
    <div class="wrapper">
        <div class="content row">
                                        <ul class="breadcrumbs cell-12">
            <li><a class="getmdl" data-getmdl="home" href="/" title="Главная"></a></li>

                    <li>
                                    <a href="/adult/">Товары для взрослых</a>
                            </li>
                    <li>
                                    <a href="/adult/pepelnicy/">Пепельницы</a>
                            </li>
                    <li>
                                    <a href="/adult/pepelnicy/380567/">Brasstico</a>
                            </li>
                    <li>
                                    <span>4114</span>
                            </li>
     
        </ul>
Нужно достать категорию "Товары для взрослых"(а дальше и все остальные).
xpath путь: //ul[contains(@class, 'breadcrumbs cell-')]/li[2]/a
И засунуть её в переменную Kategoria

Сейчас используется скрипт через браузер, но потом хотел ещё переделать под POST\GET. Так что если сможете написать и для того и для другого варианта код в котором потом можно будет менять значения буду оочень признателен!

P.S. Статью прочитал, но нихрена не понял как делать для одного элемента, а не группы. там же написано что создаем какую-то коллекцию, потом как то объединяем что-то... Непонятно в общем %)
 
Последнее редактирование:

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Сделал на Get-запросе, с браузером возись сам. Шаблон парсинга hotline.ua на xPath+HtmlAgilityPack скачать здесь. Манул по связки xPath+HtmlAgilityPack_Zennobox в этом посте форума. Основной код из шаблона:
Код:
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); // создание объекта
var template_html = project.Variables["Htnl_Code"].Value; // грузим наш код из гет-запроса http://hotline.ua/adult-pepelnicy/brasstico-4114/discussion/
// условие xpath
var var_xpath1 = @"//ul[contains(@class, 'breadcrumbs cell-')]/li[2]/a";

doc.LoadHtml(template_html); // грузим DOM текст (из переменной template_html) в объект doc
var Nodes_list_1 = doc.DocumentNode.SelectSingleNode(var_xpath1); //  получаем <a href="/adult/">Товары для взрослых</a>
if (Nodes_list_1 != null)
 {
 project.Variables["Kategoria"].Value = Nodes_list_1.InnerText; //  получаем: Товары для взрослых
 project.Variables["Kategoria_href"].Value = Nodes_list_1.GetAttributeValue("href", ""); //  получаем: /adult/
 }
else
 {
 project.SendInfoToLog("не нашли елемент", true);
 project.Variables["Kategoria"].Value = ""; //  обнуляем значение
 project.Variables["Kategoria_href"].Value = ""; //  обнуляем значение
 }
return "ok";
UPD: подправил чуть код
 
Последнее редактирование:

intagens

Client
Регистрация
28.09.2015
Сообщения
209
Благодарностей
31
Баллы
28
@orka13 подскажи плиз
есть вот такой код

Код:
HtmlAgilityPack.HtmlDocument docPage = new HtmlAgilityPack.HtmlDocument();
string strLinkNews = "https://www.newsbtc.com/2019/08/16/bitcoin-roi-stock-market-returns/";

//получаем данные GET запросом
string strGetResultBody = ZennoPoster.HttpGet(strLinkNews, "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 30000, "");
project.SendInfoToLog(strGetResultBody);

//грузим DOM текст
docPage.LoadHtml(strGetResultBody);

string strTitle = docPage.DocumentNode.SelectSingleNode("//h1").GetAttributeValue("innerHtml", "");
project.SendInfoToLog("Заголовок статьи: " + strTitle, true);
string strArticle = docPage.DocumentNode.SelectSingleNode("//span[@class='entry-content']").GetAttributeValue("innerHtml", "");
project.SendInfoToLog("Тело статьи: " + strArticle, true);
не могу получить данные из статьи ... ни название, но тело ... если использую FindElementByXPath с теми же путями - все прекрасно находится ... с помощью HtmlAgilityPack нахожу все разделы на сайте и все ссылки на статьи в разделе ... а с самой статьей не могу справиться

и еще вопрос - при использовании HtmlAgilityPack, если нужно не первый элемент брать, то номер элемента нужно указывать в самом пути Xpath, так?

спасибо
 
Последнее редактирование:

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
@orka13 подскажи плиз
есть вот такой код

Код:
HtmlAgilityPack.HtmlDocument docPage = new HtmlAgilityPack.HtmlDocument();
string strLinkNews = "https://www.newsbtc.com/2019/08/16/bitcoin-roi-stock-market-returns/";

//получаем данные GET запросом
string strGetResultBody = ZennoPoster.HttpGet(strLinkNews, "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 30000, "");
project.SendInfoToLog(strGetResultBody);

//грузим DOM текст
docPage.LoadHtml(strGetResultBody);

string strTitle = docPage.DocumentNode.SelectSingleNode("//h1").GetAttributeValue("innerHtml", "");
project.SendInfoToLog("Заголовок статьи: " + strTitle, true);
string strArticle = docPage.DocumentNode.SelectSingleNode("//span[@class='entry-content']").GetAttributeValue("innerHtml", "");
project.SendInfoToLog("Тело статьи: " + strArticle, true);
не могу получить данные из статьи ... ни название, но тело ... если использую FindElementByXPath с теми же путями - все прекрасно находится ... с помощью HtmlAgilityPack нахожу все разделы на сайте и все ссылки на статьи в разделе ... а с самой статьей не могу справиться

и еще вопрос - при использовании HtmlAgilityPack, если нужно не первый элемент брать, то номер элемента нужно указывать в самом пути Xpath, так?

спасибо
Я хз почему так код написан. Уже сам не помнил как там делать, но погуглил:
innerhtml htmlagility pack
innerText htmlagility pack
и понял что лучше так:

C#:
HtmlAgilityPack.HtmlDocument docPage = new HtmlAgilityPack.HtmlDocument();
string strLinkNews = "https://www.newsbtc.com/2019/08/16/bitcoin-roi-stock-market-returns/";
//получаем данные GET запросом
string strGetResultBody = ZennoPoster.HttpGet(strLinkNews, "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 30000, "");
project.SendInfoToLog(strGetResultBody);
//грузим DOM текст
docPage.LoadHtml(strGetResultBody);
string strTitle = docPage.DocumentNode.SelectSingleNode("//h1").InnerText;
project.SendInfoToLog("Заголовок статьи: " + strTitle, true);
string strArticle = docPage.DocumentNode.SelectSingleNode(@"//span[@class='entry-content']").InnerText;
project.SendInfoToLog("Тело статьи: " + strArticle, true);
return strGetResultBody;
 

intagens

Client
Регистрация
28.09.2015
Сообщения
209
Благодарностей
31
Баллы
28

Markoonij

Client
Регистрация
13.10.2020
Сообщения
70
Благодарностей
3
Баллы
8
В переменной dom_ids лежит DOM страницы.
Нужно из этой переменной xpath'ем выдернуть значение и положить в переменную sport.
Подскажите, как это можно реализовать.
 

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