【问题标题】:BeautifulSoup using an iterable instead of string?BeautifulSoup 使用可迭代而不是字符串?
【发布时间】:2019-05-31 12:41:45
【问题描述】:

我正在使用 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+ gigs,所以我不想在 ensoupification 之前将整个文件作为字符串啜饮,我想让 BeautifulSoup 作为迭​​代器读取数据(甚至可能从 gzcat 来避免将数据放在未压缩的文件中)。

但是,我尝试将字符串以外的任何东西交给 BS 都会导致它窒息。有没有办法让 BS 以流而不是字符串的形式读取数据?

【问题讨论】:

  • 据我所知,BS 无法读取可迭代对象。你可能想试试lxml

标签: python xml beautifulsoup xml-parsing


【解决方案1】:

你可以给BS一个文件句柄对象。

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

这是Making the Soup文档中的第一个例子

【讨论】:

  • 谢谢,太好了(虽然我当然知道直接读取 12G 文件到 BS 仍然会导致内存错误,所以我可能仍然需要分解文件......)跨度>
【解决方案2】:

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

阅读更多 herehere

【讨论】:

  • 谢谢,当它来自网络流而不是文件时,这将很有用。
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
相关资源
最近更新 更多