1. Telegram чат для обсуждения работы JS парсеров и Node.js модулей: https://t.me/a_parser_javascript
  2. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

Подстановка значений из одного парсера в другой

Тема в разделе "Техническая поддержка по JavaScript парсерам", создана пользователем chazzzzz1910, 17 окт 2018.

  1. chazzzzz1910

    chazzzzz1910 A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    20 авг 2018
    Сообщения:
    7
    Симпатии:
    0
    Добрый вечер! Ткните носом плз где ошибка. Беру урлы, беру регуляркой h1 тег и нужно найти по нему некоторые значения в гугле, например линк и анкор. Отдает только h1, при этом гугл парсится, наверное проблема в выводе. Бьюсь уже 2-й день. Спасибо!
    Код:
    class Parser {
        constructor() {
            this.defaultConf = {
                version: '0.1.16',
                results: {
                    flat: [
                        ['title', 'HTML title'],
                    ],
                    arrays: {
                        serp: ['Top1 list', [ [ 'link', 'Link' ], [ 'anchor', 'Anchor' ] ] ],
                    }
                },
                results_format: "$title : $serp.format('$link ($anchor)\\n')",
                SE_Google_Suggest_preset: 'default',
                SE_Google_preset: 'default',
            };
     
            this.editableConf = [
                ['SE_Google_preset', ['combobox', 'SE::Google preset']],
            ];
        }
    
        *parse(set, results) {
            let result = yield this.request('GET', set.query, {}, {
                check_content: ['<\/html>'],
                decode: 'auto-html',
            });
     
                let title = result.data.match(/<h1 class="title" itemprop="name">(.+?)<\/h1>/);
                results.title = title[1];
                result = yield this.parser.request('SE::Google', this.conf.SE_Google_preset, {pagecount: 1, linksperpage: 10}, title);
                results.serp.push(result.serp[0], result.serp[1]);
     
            return results;
        }
     
    }
     
  2. Support Денис

    Support Денис A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    12 июн 2017
    Сообщения:
    586
    Симпатии:
    185
    Здравствуйте. Вы в это строке передаете не выбранный title в качестве запроса, а массив
    Код:
    result = yield this.parser.request('SE::Google', this.conf.SE_Google_preset, {pagecount: 1, linksperpage: 10}, title);
    Выводите промежуточные значения в лог для отслеживания.
    Выводить можно с помощью
    Код:
    this.logger.put(переменная)
    То есть чтобы посмотреть значение result можно сделать так
    Код:
    this.logger.put(JSON.stringify(result));
     
    chazzzzz1910 нравится это.
  3. chazzzzz1910

    chazzzzz1910 A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    20 авг 2018
    Сообщения:
    7
    Симпатии:
    0
    Подскажите пожалуйста, как можно декодировать сущности средствами JS? В обычном парсере пользовался для этого конструктором результатов.
     
    #3 chazzzzz1910, 18 окт 2018
    Последнее редактирование: 18 окт 2018
  4. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.494
    Симпатии:
    2.147
    chazzzzz1910 нравится это.
  5. chazzzzz1910

    chazzzzz1910 A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    20 авг 2018
    Сообщения:
    7
    Симпатии:
    0
    Подскажите пожалуйста с еще одной проблемой. Как вставить массив со сниппетами в базу sqlite. Переменная title вставляется нормально. Перебор циклом в метод tools.sqlite.run вставить не получается. Слабоват в JS. Нагуглить ничего не получилось.
    Код:
    *parse(set, results) {
            let response = yield this.request('GET', set.query, {}, {
                check_content: ['<\/html>'],
                decode: 'auto-html',
            });
                    if(response.success) {
                let title = response.data.match(/<h1 class="title" itemprop="name">(.+?)<\/h1>/);
                    this.logger.put("Содержимое тега h1: " + title[1]);
                    results.title = title[1];
                }
                     
             let result = yield this.parser.request('SE::Bing', this.conf.SE_Google_preset, {pagecount: 1, linksperpage: 10},results.title);
                if(result.info.success) {
                /*Устанавливаем шаг прохода по циклу в зависимости от парсера.
                this.logger.put("Длина массива: " + result.serp.length);
               
                for(let i = 0 ; i < result.serp.length ; i +=3){
                this.logger.put("Записаны строки " + result.serp[i] + result.serp[i+1] + result.serp[i+2]);           
                
                results.serp.push(result.serp[i],result.serp[i+1],result.serp[i+2]);
                }
               
                results.success = result.info.success;
            }
                  tools.sqlite.run(db,'INSERT into test(title,snippets) VALUES(?,?)',results.title,results.serp[?])           
                  return results;
        }
    }
    
     
  6. Support

    Support Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    16 мар 2012
    Сообщения:
    4.494
    Симпатии:
    2.147
    В SQLite нельзя вставить в ячейку массив данных.
    results.serp - это массив. Если вы хотите вставить все или некоторые его элементы в одну ячейку - сформируйте из них строку с каким-либо разделителем и уже ее вставляйте. Либо, вы можете перебрать массив в цикле и для каждого значения, которое вы хотите записать в таблицу, создать новую строку.
     
    chazzzzz1910 нравится это.

Поделиться этой страницей