示例#1
0
class ArticleServer(object):

    def __init__(self, reactor, conf):
        self.reactor = reactor
        self.article_extractor = ArticleExtractor(conf)
        self.logger = logging.getLogger("")

    def process_request(self, response, url):
        pass

    def process_body(self, body, url):
        self.article_extractor.extract(body, url)
        print body[:100]

    def process_error(self, failure, url):
        print failure.getErrorMessage()
        self.logger.error("download error, url:%s, msg:%s" %
                (url, failure.getErrorMessage()))

    def process_task(self, url):
        url = url.encode('utf-8')
        requestProcess = (self.process_request, (url,), {})
        bodyProcess = (self.process_body, (url,), {})
        errorProcess = (self.process_error, (url,), {})

        print "article_task:", url
        self.reactor.download_and_process(url, None, requestProcess, bodyProcess, errorProcess, redirect=True)
    def get_article(self, url):

        # инициализируем UrlHandler
        urlhandler = UrlHandler()
        # получаем веб-страницу и её кодировку
        source_page, encoding = urlhandler.load_page(url)

        # инициализируем парсер, текстовый процессор, экстрактор
        html_parser = Parser(source_page, encoding)
        text_processor = TextProcessor(self.language)
        article_extractor = ArticleExtractor(self.language)
        formatter = Formatter()

        # получаем списки элементов, очищенных от тегов (raw_cleaned_elements)
        # и нет (elements_as_string)
        raw_cleaned_elements, elements_as_string = html_parser.get_parsed_nodes(
        )
        # заголовок
        title = html_parser.get_title()

        # получаем спосок лемматизированных текстов
        stemmed_tag_elements = text_processor.iterate_over_texts(
            raw_cleaned_elements)
        # получаем ранжированный список элементов
        best_nodes = article_extractor.find_best_node(stemmed_tag_elements)

        # для первого элемента из ранжированного списка
        # ищем в цикле нужный элемент с тегами (elements_as_string)
        # передаем найденный элемент в out_formatter
        for text, element in zip(raw_cleaned_elements, elements_as_string):
            if best_nodes[0][0] == text:
                node_to_format = element

        # out_formatter подготавливает текст для сохранения
        clean_text = formatter.format_article(node_to_format)

        # сохраняем в текстовый файл
        with codecs.open('output.txt', 'w', 'utf-8') as out:
            out.write(title + '\n\n')
            for paragraph in clean_text:
                for line in paragraph:
                    out.write(line)
                    out.write('\n')
                out.write('\n')
示例#3
0
 def __init__(self, reactor, conf):
     self.reactor = reactor
     self.article_extractor = ArticleExtractor(conf)
     self.logger = logging.getLogger("")