Итеративно обрабатывать большой дамп википедии - PullRequest
1 голос
/ 04 марта 2020

Я хочу анализировать большой дамп википедии итеративно. Я нашел учебное пособие для этого здесь: https://towardsdatascience.com/wikipedia-data-science-working-with-the-worlds-largest-encyclopedia-c08efbac5f5c

Однако, когда я хочу прочитать в данных, как это:

data_path = 'C:\\Users\\Me\\datasets\\dewiki-latest-pages-articles1.xml-p1p262468.bz2'

import xml.sax

class WikiXmlHandler(xml.sax.handler.ContentHandler):
    """Content handler for Wiki XML data using SAX"""
    def __init__(self):
        xml.sax.handler.ContentHandler.__init__(self)
        self._buffer = None
        self._values = {}
        self._current_tag = None
        self._pages = []

    def characters(self, content):
        """Characters between opening and closing tags"""
        if self._current_tag:
            self._buffer.append(content)

    def startElement(self, name, attrs):
        """Opening tag of element"""
        if name in ('title', 'text'):
            self._current_tag = name
            self._buffer = []

    def endElement(self, name):
        """Closing tag of element"""
        if name == self._current_tag:
            self._values[name] = ' '.join(self._buffer)

        if name == 'page':
            self._pages.append((self._values['title'], self._values['text']))

# Object for handling xml
handler = WikiXmlHandler()
# Parsing object
parser = xml.sax.make_parser()
parser.setContentHandler(handler)

# Iteratively process file
for line in subprocess.Popen(['bzcat'], 
                              stdin = open(data_path), 
                              stdout = subprocess.PIPE,shell=True).stdout:
    parser.feed(line)

    # Stop when 3 articles have been found
    if len(handler._pages) > 3:
        break

кажется, что ничего не происходит , Список handler._pages пуст. Это где проанализированные статьи должны быть сохранены. Я также добавил shell=True, потому что в противном случае я получаю сообщение об ошибке FileNotFoundError: [WinError 2].

Я никогда не работал с подпроцессами в python, поэтому я не знаю, в чем может быть проблема. Я также пытался указать data_path по-другому (с помощью / и //).

Заранее спасибо.

...