【问题标题】:read and parse a xml in chunks in R在 R 中分块读取和解析 xml
【发布时间】:2016-11-03 16:59:45
【问题描述】:

我正在尝试使用 R 从 Wikipedia Dumps 读取和处理 ~5.8GB .xml。我没有那么多 RAM,所以我想分块处理它。 (目前使用xml2::read_xml 时会完全阻塞我的电脑)

该文件为每个维基百科页面包含一个xml 元素,如下所示:

<page>
    <title>AccessibleComputing</title>
    <ns>0</ns>
    <id>10</id>
    <redirect title="Computer accessibility" />
    <revision>
      <id>631144794</id>
      <parentid>381202555</parentid>
      <timestamp>2014-10-26T04:50:23Z</timestamp>
      <contributor>
        <username>Paine Ellsworth</username>
        <id>9092818</id>
      </contributor>
      <comment>add [[WP:RCAT|rcat]]s</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text xml:space="preserve">#REDIRECT [[Computer accessibility]]

{{Redr|move|from CamelCase|up}}</text>
      <sha1>4ro7vvppa5kmm0o1egfjztzcwd0vabw</sha1>
    </revision>
</page>

文件样本可以在here找到

从我的角度来看,我认为可以分块读取它,例如文件中每页的页面。 Ans 将每个已处理的page 元素保存为.csv 文件中的一行。

我想要一个包含以下列的 data.frame。

id、标题和文本。

我该如何分块阅读这个.xml

【问题讨论】:

  • 我不确定我们能否解决您的问题。您提供给我们的样本很小,所以我无法真正重现您的问题。您是否尝试过 this(jlhoward 回答)之类的方法?
  • 想象一个.xml 有很多很多元素,比如问题中的那个。我不能只逐行阅读,因为它破坏了 xml 结构。我想逐个元素地阅读,但我不知道该怎么做......显然我链接到小样本,但你可以在这里下载完整文件:dumps.wikimedia.org/ptwiki/20161101 这是 ptwiki-20161101-pages-articles .xml.bz2

标签: r xml xml2


【解决方案1】:

它可以改进,但主要思想在这里。您仍然需要定义在 readLines() 函数内的每次交互中要读取的行数的最佳方法,以及读取每个块的方法,但是获取块的解决方案在这里:

xml <- readLines("ptwiki-20161101-pages-articles.xml", n = 2000)

inicio <- grep(pattern = "<page>", x = xml)
fim <- grep(pattern = "</page>", x = xml)
if (length(inicio) > length(fim)) { # if you get more beginnings then ends
  inicio <- inicio[-length(inicio)] # drop the last one
}

chunks <- vector("list", length(inicio))

for (i in seq_along(chunks)) {
  chunks[[i]] <- xml[inicio[i]:fim[i]]
}

chunks <- sapply(chunks, paste, collapse = " ")

我试过 read_xml(chunks[1]) %&gt;% xml_nodes("text") %&gt;% xml_text() 并且成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2010-10-13
    • 2012-11-22
    • 2021-04-15
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多