Выскабливание сложных комментариев в Scrapy - PullRequest
0 голосов
/ 05 апреля 2019

Я использую Scrapy. Я хочу почистить комментарии, например, на странице: https://www.thingiverse.com/thing:2/comments

Я буду обрабатывать больше сайтов, поэтому я хочу иметь гибкий код.

Я понятия не имею, как очищать комментарии, не теряя информацию о том, в каком «контейнере» находится комментарий, и «глубине» комментария.

Допустим, у меня будет 3 поля. Id_container, содержание и глубина. Этих сведений будет достаточно, чтобы узнать об отношениях между комментариями. Как закодировать, что каждый комментарий будет иметь эту информацию?

Вопрос общий, поэтому любые советы будут полезны

1 Ответ

1 голос
/ 06 апреля 2019

Чтобы не потерять информацию об иерархии, вы можете начать с получения всех комментариев глубины 1 и углубления, например:

from collections import OrderedDict
from pprint import pprint

def get_children_hierarchy(selector, depth=1):
    hierarchy = OrderedDict()
    children = selector.css(f'.depth-{depth}').xpath('..')
    for child in children:
        key = child.xpath('./@id').get()
        hierarchy[key] = get_children_hierarchy(child, depth+1)
    return hierarchy or None

pprint(get_children_hierarchy(response))

Вывод:

OrderedDict([('comment-2217537', None),
             ('comment-1518847', None),
             ('comment-1507448', None),
             ('comment-1233476', None),
             ('comment-1109024',
              OrderedDict([('comment-1554022', None),
                           ('comment-1215964', None)])),
             ('comment-874441', None),
             ('comment-712565',
              OrderedDict([('comment-731427',
                            OrderedDict([('comment-809279',
                                          OrderedDict([('comment-819752',
                                                        OrderedDict([('comment-1696778',
                                                                      None)]))]))]))])),
             ('comment-472013', None),
             ('comment-472012', OrderedDict([('comment-858213', None)])),
             ('comment-403673', None)])

Затем с комментарием id, вы можете иметь всю информацию, которую вы хотите для этого конкретного комментария.

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