Помогите с парсингом текста

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Посмотрел вот этот xpath .//div[@class='serp-item']
Яндекс изменил разметку, поэтому вот это уже не работает
C#:
var nodes = doc.DocumentNode
    .SelectNodes(".//div[@class='serp-item']") // взяли нужные узлы
    .Select(n => n.FirstChild)
    .Where(n => n.FirstChild.GetAttributeValue("class", "") == "serp-item__title") // взяли без рекламы
    .ToList();
Это надо по новому смотреть что там и как.

Вот мини справка по xpath
http://zennolab.com/discussion/threads/problema-s-parsingom-v-amazon.32660/#post-236794

Плюс почитать что вообще в этой теме народ пишет, ну и по форуму поиском пройти, были примеры по работе с xpath.
 
  • Спасибо
Реакции: Pico

Pico

Client
Регистрация
24.05.2012
Сообщения
34
Благодарностей
5
Баллы
8
Посмотрел вот этот xpath .//div[@class='serp-item']
Яндекс изменил разметку, поэтому вот это уже не работает
C#:
var nodes = doc.DocumentNode
    .SelectNodes(".//div[@class='serp-item']") // взяли нужные узлы
    .Select(n => n.FirstChild)
    .Where(n => n.FirstChild.GetAttributeValue("class", "") == "serp-item__title") // взяли без рекламы
    .ToList();
Это надо по новому смотреть что там и как.

Вот мини справка по xpath
http://zennolab.com/discussion/threads/problema-s-parsingom-v-amazon.32660/#post-236794

Плюс почитать что вообще в этой теме народ пишет, ну и по форуму поиском пройти, были примеры по работе с xpath.
Я создал очень простой проект со следующим кодом:
var html = project.Variables["responseResult"].Value;
var doc = new HtmlDocument();
doc.LoadHtml(html);

В responseResult я кинул html страницу.
При исполнении всеравно выдает исключение. Мне кажется зеньке что-то не нравится, более того она полностью игнорит директиву using. Может быть проблема в установленом MS Visual Studio 2010?
 

Вложения

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Какое исключение? Скриншот ошибки.

Студия тут не при делах.
У меня стоит 2010, 2013, 2015:D
Все норм.
Винда какая? Зенка какая? .net framework последний стоит?(http://www.asoft.be/prod_netver.html проверить и обновить если надо)
 

Pico

Client
Регистрация
24.05.2012
Сообщения
34
Благодарностей
5
Баллы
8
Какое исключение? Скриншот ошибки.

Студия тут не при делах.
У меня стоит 2010, 2013, 2015:D
Все норм.
Винда какая? Зенка какая? .net framework последний стоит?(http://www.asoft.be/prod_netver.html проверить и обновить если надо)
upload_2016-12-23_23-28-56.png
Зенка 5.4.3.0
Винда - 10.
Netver выдал следующее:

<32Bit>
2.0.50727.8745
->C:\Windows\Microsoft.NET\Framework\v2.0.50727
4.6.1586.0
->C:\Windows\Microsoft.NET\Framework\v4.0.30319

<64Bit>
2.0.50727.8745
->C:\Windows\Microsoft.NET\Framework64\v2.0.50727
4.6.1586.0
->C:\Windows\Microsoft.NET\Framework64\v4.0.30319

< Installed .NET Frameworks >
.NET FW 2.0 SP 2 (CLR:2.0)
.NET FW 3.0 SP 2 (CLR:2.0)
.NET FW 3.5 SP 1 (CLR:2.0)
.NET FW 4.6.2 (CLR:4.0)

< Installed Updates >
Microsoft .NET Framework 4 Client Profile
KB2468871
KB2468871v2
KB2478063
KB2533523
KB2544514
KB2600211
KB2600217
Microsoft .NET Framework 4 Extended
KB2468871
KB2468871v2
KB2478063
KB2533523
KB2544514
KB2600211
KB2600217
KB2468871
KB2468871v2
KB2478063
KB2533523
KB2544514
KB2600211
KB2600217

< Installed Languages 3.0>
English - United States
< Installed Languages 3.5.x>
English - United States
< Installed Languages 4.x>
English - United States
 

Вложения

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Фреймворк последний, норм.
Скорее всего дело в зенке. Слишком уж она древняя, а винда новая - 10.
Попробуй какой нибудь другой кусок кода вставить, желательно тоже с подключаемыми либами и using(на форуме полного такого).
Если тоже будет ошибка, то вероятнее всего какая то несовместимость зенки и винды.

Обновляй зенку.:-)
 
  • Спасибо
Реакции: Pico

Pico

Client
Регистрация
24.05.2012
Сообщения
34
Благодарностей
5
Баллы
8
Фреймворк последний, норм.
Скорее всего дело в зенке. Слишком уж она древняя, а винда новая - 10.
Попробуй какой нибудь другой кусок кода вставить, желательно тоже с подключаемыми либами и using(на форуме полного такого).
Если тоже будет ошибка, то вероятнее всего какая то несовместимость зенки и винды.

Обновляй зенку.:-)
Спасибо за уделенное время! Будем обновляться :-)
 

Pico

Client
Регистрация
24.05.2012
Сообщения
34
Благодарностей
5
Баллы
8
Зенку обновил, вроде как сниппет уже выполняется, только кнопка Тест исчезла
upload_2016-12-24_12-9-9.png
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
  • Спасибо
Реакции: Pico

Pico

Client
Регистрация
24.05.2012
Сообщения
34
Благодарностей
5
Баллы
8

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Вот не подскажу, у разработчиков спросить надо. Этот вопрос уже подымался на форуме.
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Помогите понять, что происходит. При попытке получить данные из переменной "responseResult", получаю только кусок
PHP:
var html = project.Variables["responseResult"].Value; // html страница
var doc = new HtmlDocument();
doc.LoadHtml(html); // создали объект HtmlDocument и загрузили в него html страницу
var nodes = doc.DocumentNode
    .SelectNodes(".//div[@class='serp-item']") // взяли нужные узлы
    .Select(n => n.FirstChild)
    .Where(n => n.FirstChild.GetAttributeValue("class", "") == "serp-item__title") // взяли без рекламы
    .ToList();
         
var list = new List<string>();
foreach (var node in nodes) // в цикле добавляем в список элемент состоящий из двух строчек
{
    var title = node.FirstChild.FirstChild.InnerText; // текст первой строчки
    var desc = node.SelectSingleNode(".//div[@class='path organic__path']").InnerText; // текст второй строчки
    list.Add(title + "\r\n" + desc); // добавил в список "двойную строчку"
}
var res = string.Join("\r\n", list); // объединил двойный строчки
return res;
Получено было при Get-запросе код страницы в 450к, а вот при передаче его из переменной "responseResult" в "html" кода остаётся (передаётся) всего 100к.
Естественно, дальнейшие действия становятся бессмысленными, так как нужного кода нету. Непонятно, куда девается код, и почему он пропадает?
Версия Зенки 5.10.4.1.
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Никто ответа не знает. А ведь знали когда использовали этот код
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Получено было при Get-запросе код страницы в 450к, а вот при передаче его из переменной "responseResult" в "html" кода остаётся (передаётся) всего 100к.
Само никуда ничего не может пропасть.

Получено было при Get-запросе код страницы в 450к
Как ты проверяешь размер? Где ты его смотришь? Что с ответом делаешь?

а вот при передаче его из переменной "responseResult" в "html"
Где ты смотришь это?

Получается ты каким то образом узнал размер get запроса. Он было одного размера, положил в responseResult и он стал другого размера?:-)
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
не всё таки многим ещё надо понять что такое гет запрос и что присылает )
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Получается ты каким то образом узнал размер get запроса. Он было одного размера, положил в responseResult и он стал другого размера?
Сравниваю то, что попало в переменную "responseResult" , с тем, что потом передалось в "html".

не всё таки многим ещё надо понять что такое гет запрос и что присылает )
Ясное дело. К сожалению, всё познаётся методом научного тыка.
Мог бы и объяснить, если знаешь.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
ты к кому делал гет запрос что они тебе выдали аж 450к строк ? )) чё там за инопланетянская кампания ?? )
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
ты к кому делал гет запрос что они тебе выдали аж 450к строк ? )) чё там за инопланетянская кампания ?? )
К дяде Яше обращаюсь (Yandex.ru), по коду, отсюда, первый, там где "Взяли страницу".
Я не пояснил, потому ввёл в заблуждение. Получил 450к знаков (length - иностранное слово, взятое из Notepad++, которое переводят как "длина"), а не строк
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
length это иностраное слово определяет количество символов
 
  • Спасибо
Реакции: Valiksim

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
а зачем определять вообще сколько символов нам на гет запрос прислали ответ ?? ты байты хочешь вычислить ?
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
length это иностраное слово определяет количество символов
Ну да, "символов". "Знаки" это уже другое...

Так что там по существу вопроса? Хотелось бы понять, как заставить код работать. Если можно. С количеством я понял, что в переменную "html" просто невозможно передать так много знаков, значит, надо разбираться с тем, что происходит дальше. Дальше, вопрос в том, чтобы правильно настроить то, что нам нужно. В теме обсуждаются "2 строки", и, не совсем понятно какие. В реальности, надо просто получить сниппет, без рекламы. Он сейчас однострочный и сидит вот тут
PHP:
//div[contains(@class, 'text-container typo typo_text_m typo_line_m organic__text')]
. Полный путь, вся выдача, вот тут показывается -
PHP:
//div[contains(@class, 'organic typo typo_text_m typo_line_s')]
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
(Ну ты и Штирлиц...)
а зачем определять вообще сколько символов нам на гет запрос прислали ответ ?? ты байты хочешь вычислить ?
Можно, конечно, и байты и терабайты посчитать, но, я просто сравнил два значения, те, что получились после Get и те, что передались в "html". Увидел, что они разные, подумал, что дальше не идёт парсинг из-за разности. Вот всё
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
ни разу ограничение не видел чтобы переменая больше 450 знаков или символов не принимала
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
ни разу ограничение не видел чтобы переменая больше 450 знаков или символов не принимала
Попробуй, увидишь
Запусти Get, получи значение в переменную "responseResult", затем следующим шагом запусти код:
PHP:
string html = project.Variables["responseResult"].Value; // html страница
project.SendInfoToLog(html);
Увидишь, сколько чего передалось в "html"
Всё отсюда
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
(Ну ты и Штирлиц...)

Можно, конечно, и байты и терабайты посчитать, но, я просто сравнил два значения, те, что получились после Get и те, что передались в "html". Увидел, что они разные, подумал, что дальше не идёт парсинг из-за разности. Вот всё
я не штирлец, я тебе в 100-й раз говорю что гет запрос и работа с браузером это разнве вещи
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
я не штирлец, я тебе в 100-й раз говорю что гет запрос и работа с браузером это разнве вещи
Да я просто так сказал, не в обиду. То, что разные понятно, но мы тут вроде браузер не затрагиваем.
1. получили гет-ом данные
2. далее, обрабатываем в программе, никуда не заходя
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Попробуй, увидишь
Запусти Get, получи значение в переменную "responseResult", затем следующим шагом запусти код:
PHP:
string html = project.Variables["responseResult"].Value; // html страница
project.SendInfoToLog(html);
Увидишь, сколько чего передалось в "html"
Всё отсюда
у тебя нет этого кода в переменой если что при последующем запуске, у тебя даже нет ответа в переменой от гет запроса если это на C#
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Задачка интересная поэтому поковырялся.:-)

Для начала посмотрим на страницу и решим какие элементы будут вытаскиваться.
Вытаскиваться будут эти узлы через xpath, в них находится вся небходимая инфа.


Есть блоки с рекламой, а есть без. С рекламой будем выкидывать.
Как понять какие блоки с рекламой, а какие нет.

С рекламой


Без рекламы


Т.к. это "типа парсер" то страницы с яндекса будут браться через GET запрос, для скорости.:-)
Для работы с html страницей будет использоваться либа HtmlAgilityPack.dll.

Взяли страницу
Код:
var url = "https://yandex.ru/search/?lr=197&msid=1465109974.29885.22890.18047&text=%D0%9A%D1%83%D0%BF%D0%B8%D1%82%D1%8C%20%D1%80%D0%BE%D0%B7%D1%8B%20%D1%81%D0%B0%D0%B6%D0%B5%D0%BD%D1%86%D1%8B%20%D0%B4%D0%B5%D1%88%D0%B5%D0%B2%D0%BE%2C%20%D0%9A%D0%B8%D0%B5%D0%B2%2C%20%D0%A3%D0%BA%D1%80%D0%B0%D0%B8%D0%BD%D0%B0";

var response = ZennoPoster.HttpGet(
    url,
    "",
    "utf-8",
    InterfacesLibrary.Enums.Http.ResponceType.BodyOnly,
    5000,
    "",
    "",
    true,
    5,
    new []
    {
        "Host: yandex.ru",
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding: gzip, deflate, sdch",
        "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4",
        "Connection: keep-alive",
        "Upgrade-Insecure-Requests: 1"
    }
);

if(response == "")
{
    project.SendErrorToLog("Пустой ответ", true);
    return null;
}

return response;

Вытащили нужную инфу
Код:
var html = project.Variables["responseResult"].Value; // html страница

var doc = new HtmlDocument();
doc.LoadHtml(html); // создали объект HtmlDocument и загрузили в него html страницу

var nodes = doc.DocumentNode
    .SelectNodes(".//div[@class='serp-item']") // взяли нужные узлы
    .Select(n => n.FirstChild)
    .Where(n => n.FirstChild.GetAttributeValue("class", "") == "serp-item__title") // взяли без рекламы
    .ToList();
        

var list = new List<string>();

foreach (var node in nodes) // в цикле добавляем в список элемент состоящий из двух строчек
{
    var title = node.FirstChild.FirstChild.InnerText; // текст первой строчки
    var desc = node.SelectSingleNode(".//div[@class='path organic__path']").InnerText; // текст второй строчки

    list.Add(title + "\r\n" + desc); // добавил в список "двойную строчку"
}

var res = string.Join("\r\n", list); // объединил двойный строчки

return res;

Результат


Всё отсюда брал. Загляни под спойлер
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Попробуй, увидишь
Запусти Get, получи значение в переменную "responseResult", затем следующим шагом запусти код:

Вот тут проверятся кол-во символов которое пришло в get запросе.
Т.е. примерно так.
project.SendInfoToLog(response.Length.ToString());
И в логе видно что 450к символов.
Данный кубик завершается тем, что возвращает response, т.е. значение из response кладется в responseResult.


Тут тоже делаем проверку.
project.SendInfoToLog(html.Length.ToString());
И магическим образом в html оказывается не 450к а 100к.
И между предыдущим и текущим кубиками никаких телодвижений с переменной responseResult не делается.

Все верно?
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Данный кубик завершается тем, что возвращает response, т.е. значение из response кладется в responseResult.
Тут всё понятно.

Тут тоже делаем проверку.
project.SendInfoToLog(html.Length.ToString());
И магическим образом в html оказывается не 450к а 100к.
Воистину так.

Верно.

Теперь надо к следующему шагу переходить:
- выстроить логику парсинга первых 10 страниц выдачи
- и сбора данных в этом цикле в один список...
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Теперь надо к следующему шагу переходить:
- выстроить логику парсинга первых 10 страниц выдачи
- и сбора данных в этом цикле в один список...
Ты подожди, тут ты только один запрос делаешь, и у тебя магическим образом часть данных пропадает.
Страшно представить что будет если в цикле замутить. Еще винт сам форматнется.:D

Первый экешн, получили get запрос, кол-во символов 349710.



Второй экшен, сравнили, кол-во символов 349710.



Получено было при Get-запросе код страницы в 450к, а вот при передаче его из переменной "responseResult" в "html" кода остаётся (передаётся) всего 100к.
Естественно, дальнейшие действия становятся бессмысленными, так как нужного кода нету. Непонятно, куда девается код, и почему он пропадает?
Ты понимаешь что вот это твое утверждение звучит минимум как бред?
Т.к. это в принципе невозможно.

Идет получение get запроса, потом идет тупо перекладывание значения из одной переменной в другую, причем никаких манипуляций с этими переменными не делается, и в итоге по пути теряется часть данных.o_O

Другими словами:
get запрос - "тут какой то любой текст"
A - response
B - responseResult
С - html

A = "тут какой то любой текст"
B = A
С = B

Проверяем что в С, и там из всего текста находится только "тут".:-)

Ну ок, могу предположить один крайне маловероятный вариант.
Когда данные пихаются в responseResult, т.к. это переменная внутри зенки, и мы не видим что там творится, то возможно зенка там чето химичит с твоими данными.:eek:
Но скорее всего это ты какую то фигню делаешь.

Ты бы скрины выложил, с описанием что и как делаешь, для подтверждения твоих слов.
А то вдруг ты уникальный баг нашел.:-)
 

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