BeautifulSoup, используя итеративный вместо строки? - PullRequest
0 голосов
/ 05 января 2019

Я анализирую файл метаданных Википедии с bs4 и python 3.5

Это работает для извлечения из тестового среза (намного большего) файла:

from bs4 import BeautifulSoup

with open ("Wikipedia/test.xml", 'r') as xml_file:
    xml = xml_file.read()

print(BeautifulSoup(xml, 'lxml').select("timestamp"))

Проблема заключается в том, что файлы метаданных имеют все 12+ гигабайт, поэтому вместо того, чтобы изгибать весь файл в виде строки перед присоединением, я бы хотел, чтобы BeautifulSoup считывал данные как итератор (возможно, даже из gzcat, чтобы избежать хранение данных в несжатых файлах).

Однако мои попытки передать BS что-либо, кроме строки, заставляют его задыхаться. Есть ли способ заставить BS читать данные как поток вместо строки?

Ответы [ 2 ]

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

BeautifulSoup или lxml не имеет опции потока, но вы можете использовать iterparse() для чтения больших файлов XML в чанке

import xml.etree.ElementTree as etree

for event, elem in etree.iterparse("Wikipedia/test.xml", events=('start', 'end')):
  ....
  if event == 'end':
      ....
      elem.clear() # freed memory

Подробнее здесь или здесь

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

Вы можете присвоить BS объект дескриптора файла.

with open("Wikipedia/test.xml", 'r') as xml_file:
    soup = BeautifulSoup(xml_file, 'lxml')

Это первый пример в документации Создание супа

...