Python鹅提取器-“ KNOWN_ARTICLE_CONTENT_TAGS”流程似乎无效

时间:2019-01-07 06:56:55

标签: python-2.7 text-extraction goose

将python goose2用于python 2.7。

放置您要提取的文章的标签/类或ID的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'])行始终返回null。

我如何让鹅把已知列表中提到的那些属性/类/标签内的所有文本全部提取,像上面的示例一样,我想获取多个p标签内的所有文本(可以是其他标签以及除p以外的其他标签,与得分无关?

编辑: 在尝试对其进行进一步调试时,我意识到 get_known_articles_tags 函数仅返回在dict中找到的第一个找到的标签/属性, 专注于:return nodes[0]

因此它只返回该单个节点的文档,然后仅发送该节点对象以找到顶部节点-并假设该节点不满足良好/顶部节点的条件,则它返回为空,因此失败。

我如何合并nodes列表中的所有节点对象,并将所有节点作为文档发送以进行解析并用于查找顶部节点?

1 个答案:

答案 0 :(得分:0)

我设法解决了与此问题有关的问题

我更改了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语法实现了它。