Пользователь Support разместил новый ресурс: JS::TextFromSE - Парсинг текстовки по ключу одним заданием Узнать больше об этом ресурсе...
Код парсера Данный парсер - это пример обьединения парсера поисковой выдачи и парсера текста в одном Есть возможность выбрать ПС: Google или Яндекс Для выбранной ПС и парсера текста можно задать собственные пресеты настроек. Тем самым можно регулировать кол-во ссылок, по которым будет парситься текст, а также настроить парсер текста (задать минимальный размер блока, юзер агент и т.п.) Пример такой настройки: В результат выводится ключ, ссылка и текст. Текст никак дополнительно не чистится, можно использовать Конструктор результатов как в обычном парсере текста Алгоритм работы: По ключу из выбранного поисковика парсятся ссылки Полученные ссылки передаются в HTML::TextExtractor для получения текста С помощью this.query.add ссылки распределяются по потоках, для равномерной нагрузки
У Вас в примере в Override option показан HTML TextExtractorPreset как я понял для очистки текста. Но реально его нет возможности добавить, т.к. его нет в списке. Пожалуйста добавьте в примере готовый парсер с фильтрами очистки как в примере.
Пользователь Support обновил ресурс JS::TextFromSE новой записью: Обновление 1.1 Узнать больше об этом обновлении...
Пользователь Support обновил ресурс JS::TextFromSE новой записью: Обновление 1.2 Узнать больше об этом обновлении...
Здравствуйте Как в таком случае можно чистить текст? Т.к. если просто парсить по ссылкам, можно сделать parser result и удалять ненужное. В данном же случае софт тянет и менюшки и даты и прочий мусор со страницы Спасибо
Здравствуйте. Для очистки текста вы можете использовать конструктор результатов. И соответственно с его помощью очищать текст. Более подробно о конструкторе результатов вы можете почитать по ссылке
Добрый день подскажите как в этом парсере из текста (text) выбрать предложения длинной больше 50 символов, обработка результата text конструктором результатов приводит к тому что парсер закрывается с ошибкой. Обработку делал по примеру https://a-parser.com/resources/191/ Пришел к выводу что нужно добавить это в сам парсер, регулярка ([^.!?]{50,}(?:[.!?])) Код: *parseText(set, results) { this.logger.put("Scraping text from " + set.query); let response = yield this.parser.request('HTML::TextExtractor', this.conf.HTML_TextExtractor_preset, set.query); results.key = set.first; results.link = set.query; if(response.info.success) { results.text = response.texts.join("\n"); results.title = response.data.match(/<title>\s*(.+?)\s*<\/title>/)[1]; this.logger.put(set.query + " - " + response.texts.length + " blocks, " + results.text.length + " chars"); results.success = 1; } else { this.logger.put(set.query + " - error scraping text"); results.success = 0; }
Здравствуйте. Для того что бы решить этот вопрос надо сделать следующее 1)Добавить в переменные результата массив предложений Код: arrays :{ sentences: ['sentences',[ ['sent','sentences'], ]] } 2)Используя регулярное выражение поделить текст на предложения Код: let sen = /([^.!?]{30,}(?:[.!?]|$))/g; let block; while(block = sen.exec(results.text)){ results.sentences.push(block[1]); } Спойлер: Код всего парсера class Parser { constructor() { this.defaultConf = { version: '1.2.1', results: { flat: [ ['key', 'Keyword'], ['link', 'Link'], ['text', 'Text'], ], arrays :{ sentences: ['sentences',[ ['sent','sentences'], ]] } }, results_format: "$key - $link\\n$text\\n\\n", search_engine: 'SE::Google', SE_Google_preset: 'default', SE_Yandex_preset: 'default', HTML_TextExtractor_preset: 'default', }; this.editableConf = [ ['SE_Google_preset', ['combobox', 'SE::Google preset']], ['SE_Yandex_preset', ['combobox', 'SE::Yandex preset']], ['HTML_TextExtractor_preset', ['combobox', 'HTML::TextExtractor preset']], ['search_engine', ['combobox', 'Search engine', ['SE::Google', 'Google'], ['SE::Yandex', 'Yandex']]], ]; } *parse(set, results) { return yield* set.lvl == 0 ? this.parseSE(set, results) : this.parseText(set, results); } *parseSE(set, results) { this.logger.put("Start scraping query: " + set.query); this.logger.put(`Use ${this.conf.search_engine}`); let SEresp = yield this.parser.request( this.conf.search_engine, this.conf[this.conf.search_engine.replace(/::/, '_') + '_preset'], set.query ); if(SEresp.info.success) { let link_count = 0; let step = this.conf.search_engine == 'SE::Google' ? 3 : 6; for (let i = 0; i < SEresp.serp.length; i += step) { const link = SEresp.serp; this.query.add(link); link_count += 1; } this.logger.put("Added " + link_count + " links"); results.success = 1; results.SKIP = 1; return results; } else { this.logger.put(`Error scraping ${this.conf.search_engine}`); results.success = 0; return results; } } *parseText(set, results) { this.logger.put("Scraping text from " + set.query); let response = yield this.parser.request('HTML::TextExtractor', this.conf.HTML_TextExtractor_preset, set.query); results.key = set.first; results.link = set.query; if(response.info.success) { results.text = response.texts.join("\n"); // Здесь будум выбирать предложения let sen = /([^.!?]{30,}(?:[.!?]|$))/g; let block; while(block = sen.exec(results.text)){ results.sentences.push(block[1]); } this.logger.put(set.query + " - " + response.texts.length + " blocks, " + results.text.length + " chars"); results.success = 1; } else { this.logger.put(set.query + " - error scraping text"); results.success = 0; } return results; } }
Да работает спасибо, а заставить первый парсер ходить через прокси, а второй без него. Или если нет то подсовывать локальный прокси, чтобы трафик шел напрямую - такое возможно?
Вы можете сделать пресет настроек для HTML::TextExtractor в котором отключите прокси. И затем через Override указать этот пресет в настройках.
Используйте команду this.proxy.set('Тут укажите проксю',true) ; Код: *parseText(set, results) { this.logger.put("Scraping text from " + set.query); this.proxy.set('http://проксю тут поставьте',true); results.sentences = []; let response = yield this.parser.request('HTML::TextExtractor', this.conf.HTML_TextExtractor_preset, set.query); results.key = set.first; results.link = set.query; if(response.info.success) { results.text = response.texts.join("\n"); // Здесь будум выбирать предложения let sen = /([^.!?]{30,}(?:[.!?]|$))/g; let block; while(block = sen.exec(results.text)){ results.sentences.push(block[1]); } this.logger.put(set.query + " - " + response.texts.length + " blocks, " + results.text.length + " chars"); results.success = 1; } else { this.logger.put(set.query + " - error scraping text"); results.success = 0; } return results; }
Метод push выдает ошибку - JavaScript error: TypeError: Cannot read property 'push' of undefined at Parser.parseText (files/parsers/TextFromSE/TextFromSE.js:78:18) at Как это исправить
Добрыйдень. Попытался в парсере поменять SE::Google на SE::Google::Modern, но выдает ошибку Код: 07/12 12:56:30 Parser JS::TextFromSEmodern::0 parse query мойка 07/12 12:56:30 Use proxy socks://**************:4532 07/12 12:56:30 Start scraping query: мойка 07/12 12:56:30 Use SE::Google::Modern 07/12 12:56:30 JavaScript error: Parser 'SE::Google::Modern' or preset '' not exists at build/core.to_build.pl line 41334. 07/12 12:56:30 Thread complete work 07/12 12:56:31 <keyword></keyword><link></link> <title></title> <content><content> Вот сам код парсера. Помогите исправить. Код: class Parser { constructor() { this.defaultConf = { version: '1.2.113', results: { flat: [ ['key', 'Keyword'], ['link', 'Link'], ['title', 'Title'], ['text', 'Text'], ] }, results_format: "<keyword>$key</keyword><link>$link</link>\\n<title>$title</title>\\n<content>$text<\content>\\n\\n", search_engine: 'SE::Google::Modern', SE_Google_Modern_preset: 'default', SE_Yandex_preset: 'default', HTML_TextExtractor_preset: 'default', }; this.editableConf = [ ['SE_Google_Modern_preset', ['combobox', 'SE::Google::Modern preset']], ['SE_Yandex_preset', ['combobox', 'SE::Yandex preset']], ['HTML_TextExtractor_preset', ['combobox', 'HTML::TextExtractor preset']], ['search_engine', ['combobox', 'Search engine', ['SE::Google::Modern', 'GoogleModern'], ['SE::Yandex', 'Yandex']]], ]; } *parse(set, results) { return yield* set.lvl == 0 ? this.parseSE(set, results) : this.parseText(set, results); } *parseSE(set, results) { this.logger.put("Start scraping query: " + set.query); this.logger.put(`Use ${this.conf.search_engine}`); let SEresp = yield this.parser.request( this.conf.search_engine, this.conf[this.conf.search_engine.replace(/::/, '_') + '_preset'], set.query ); if(SEresp.info.success) { let link_count = 0; let step = this.conf.search_engine == 'SE::Google::Modern' ? 3 : 6; for (let i = 0; i < SEresp.serp.length; i += step) { const link = SEresp.serp[i]; this.query.add(link); link_count += 1; } this.logger.put("Added " + link_count + " links"); results.success = 1; results.SKIP = 1; return results; } else { this.logger.put(`Error scraping ${this.conf.search_engine}`); results.success = 0; return results; } } *parseText(set, results) { this.logger.put("Scraping text from " + set.query); let response = yield this.parser.request('HTML::TextExtractor', this.conf.HTML_TextExtractor_preset, set.query); results.key = set.first; results.link = set.query; if(response.info.success) { results.text = response.texts.join("\n"); results.title = response.data.match(/<title>\s*(.+?)\s*<\/title>/)[1]; this.logger.put(set.query + " - " + response.texts.length + " blocks, " + results.text.length + " chars filename:" + results.filename); results.success = 1; } else { this.logger.put(set.query + " - error scraping text"); results.success = 0; } return results; } }
Я это понял что несоответствие, но я не могу понять как правильно, в упор не вижу в чем ошибка. Пресеты у меня все подтягиваются корректно