Python Goose Extractor - поток "KNOWN_ARTICLE_CONTENT_TAGS" не кажется эффективным - PullRequest
0 голосов
/ 07 января 2019

Использование python goose2 для python 2.7.

KNOWN_ARTICLE_CONTENT_TAGS, куда вы помещаете теги / класс или идентификатор статьи, которую вы хотите извлечь, похоже, не работает.

скажем, например, взять внутри теги по умолчанию как

KNOWN_ARTICLE_CONTENT_TAGS = [
    {'attr': 'itemprop', 'value': 'articleBody'},
    {'attr': 'class', 'value': 'post-content'},
    {'tag': 'article'},
]

Теперь мой первый вопрос: какова точная логика, по которой эти значения берутся?

  • считает ли он, что весь текст внутри этих текстов является текстом по умолчанию?
  • Являются ли они просто ссылкой на гуся, чтобы увеличить счет текста внутри этих узлов, но не гарантирует, что все будет отображаться?
  • неужели гусь игнорирует другие общие общие теги, учитывают только эти теги?
  • я видел, что пропускает добавление родного брата, если он возвращает true, что это значит?

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

также при дальнейшем копании я увидел, что функция

 def get_known_article_tags(self):
        for item in KNOWN_ARTICLE_CONTENT_TAGS:
            nodes = self.parser.getElementsByTag(
                            self.article.doc,
                            **item)
            if len(nodes):
                return nodes[0]
        return None

работает с article.doc объектом, который, похоже, не имеет тегов.

также это почти для всех сообщений возвращает только элемент с тегом article, а не элементы с атрибутами itemprop = articleBody , даже если они есть в статье.

при отладке функции is_articlebody, как видно из кода ниже

  def is_articlebody(self, node):
        for item in KNOWN_ARTICLE_CONTENT_TAGS:
            # attribute
            if "attr" in item and "value" in item:
                if(self.config.debug):
                    print 'for attr and value'
                    print self.parser.getAttribute(node, item['attr'])
                    print item['value']
                    print node
                if self.parser.getAttribute(node, item['attr']) == item['value']:
                    if(self.config.debug):
                        print 'is article body from attribute'
                    return True
            # tag
            if "tag" in item:
                print 'if tag'
                print node.tag
                if node.tag == item['tag']:
                    if(self.config.debug):
                        print 'is article body from tag'
                    return True

я заметил, что эта функция никогда не возвращала true, даже если в целевом документе извлечения были такие теги / классы.

t Чтобы строка print self.parser.getAttribute(node, item['attr']) всегда возвращалась как ноль.

Как мне заставить гуся взять весь текст внутри тех атрибутов / классов / тегов, которые указаны в известном списке , как и в приведенном выше примере, я хочу получить весь текст внутри нескольких тегов p (может быть другой кроме тегов p) независимо от оценки?

Редактировать: пытаясь отладить его, я понял, что функция get_known_articles_tags возвращает только первый найденный тег / атрибут, найденный в dict, сосредоточиться на: return nodes[0]

, поэтому он возвращает только этот единственный узел документа, а затем отправляет только этот объект узла, чтобы найти верхний узел - и предположим, что узел не удовлетворяет условиям хорошего / верхнего узла, затем он возвращается как пустой, что приводит к сбою ,

как мне объединить все объекты узлов в списке nodes и отправить все узлы в качестве документа для анализа и использования его для поиска верхнего узла?

1 Ответ

0 голосов
/ 09 января 2019

Мне удалось решить проблему, связанную с этим вопросом,

я изменил область действия оператора return и передал весь массив, как это было

def get_known_article_tags(self):
        for item in KNOWN_ARTICLE_CONTENT_TAGS:
            nodes = self.parser.getElementsByTag(
                            self.article.doc,
                            **item)
        if len(nodes):
            return nodes
        return None

Затем я передал один и тот же массив узлов очистителям по одному узлу за раз (внутри массива) и передал весь массив функции calculate_top_node как

self.article.top_node = self.extractor.calculate_best_node(doc)

затем просто добавил дополнительный цикл в функцию nodes_to_check для проверки всех узлов массива,

def nodes_to_check(self, docs):
        """\
        returns a list of nodes we want to search
        on like paragraphs and tables
        """
        nodes_to_check = []

        for doc in docs:
            for tag in ['p', 'pre', 'td']:
                items = self.parser.getElementsByTag(doc, tag=tag)
                nodes_to_check += items
        return nodes_to_check

и это решило проблему возврата только одного элемента.

Мне удалось придумать это, взглянув на логику гусиного кода Python 3, которая более поддерживается и реализована с использованием синтаксиса python2.7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...