使用 R 解析维基百科转储时出错

Error parsing wikipedia dump with R

出于研究目的,我想解析一些来自法语维基百科的转储。这是我要解析的 XML 文件的摘录:

 <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="fr">
  <siteinfo>
    <sitename>Wikipédia</sitename>
    <dbname>frwiki</dbname>
    <base>https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal</base>
    <generator>MediaWiki 1.27.0-wmf.15</generator>
    <case>first-letter</case>
    <namespaces>
      <namespace key="-2" case="first-letter">Média</namespace>
      <namespace key="-1" case="first-letter">Spécial</namespace>
      <namespace key="0" case="first-letter" />
      <namespace key="1" case="first-letter">Discussion</namespace>
      <namespace key="2" case="first-letter">Utilisateur</namespace>
      <namespace key="3" case="first-letter">Discussion utilisateur</namespace>
      <namespace key="4" case="first-letter">Wikipédia</namespace>
      <namespace key="5" case="first-letter">Discussion Wikipédia</namespace>
      <namespace key="6" case="first-letter">Fichier</namespace>
      <namespace key="7" case="first-letter">Discussion fichier</namespace>
      <namespace key="8" case="first-letter">MediaWiki</namespace>
      <namespace key="9" case="first-letter">Discussion MediaWiki</namespace>
      <namespace key="10" case="first-letter">Modèle</namespace>
      <namespace key="11" case="first-letter">Discussion modèle</namespace>
      <namespace key="12" case="first-letter">Aide</namespace>
      <namespace key="13" case="first-letter">Discussion aide</namespace>
      <namespace key="14" case="first-letter">Catégorie</namespace>
      <namespace key="15" case="first-letter">Discussion catégorie</namespace>
      <namespace key="100" case="first-letter">Portail</namespace>
      <namespace key="101" case="first-letter">Discussion Portail</namespace>
      <namespace key="102" case="first-letter">Projet</namespace>
      <namespace key="103" case="first-letter">Discussion Projet</namespace>
      <namespace key="104" case="first-letter">Référence</namespace>
      <namespace key="105" case="first-letter">Discussion Référence</namespace>
      <namespace key="828" case="first-letter">Module</namespace>
      <namespace key="829" case="first-letter">Discussion module</namespace>
      <namespace key="2300" case="first-letter">Gadget</namespace>
      <namespace key="2301" case="first-letter">Gadget talk</namespace>
      <namespace key="2302" case="case-sensitive">Gadget definition</namespace>
      <namespace key="2303" case="case-sensitive">Gadget definition talk</namespace>
      <namespace key="2600" case="first-letter">Sujet</namespace>
    </namespaces>
  </siteinfo>
  <page>
    <title>Antoine Meillet</title>
    <ns>0</ns>
    <id>3</id>
    <revision>
      <id>123903866</id>
      <parentid>123513568</parentid>
      <timestamp>2016-03-02T15:50:55Z</timestamp>
      <contributor>
        <username>RobokoBot</username>
        <id>2090299</id>
      </contributor>
      <minor/>
      <comment>Ajout d'une puce avant {{Autorité}} suite à la modification du modèle</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text id="123933672" bytes="9683" />
      <sha1>f9e9rj6s5eistpyimc4xqrtauni5uc3</sha1>
    </revision>
  </page>
  <page>
    <title>Algèbre linéaire</title>
    <ns>0</ns>
    <id>7</id>
    <revision>
      <id>123705494</id>
      <parentid>121738150</parentid>
      <timestamp>2016-02-25T16:21:28Z</timestamp>
      <contributor>
        <username>Anareth</username>
        <id>2426186</id>
      </contributor>
      <minor/>
      <comment>/* Histoire */ grammaire</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text id="123731807" bytes="17107" />
      <sha1>iewjt56i5p1bhxup95b9bp08r5u0t9u</sha1>
    </revision>
  </page>

但是当我尝试用代码

解析它时
library(XML)
data <- xmlParse("test.xml")

我收到以下错误:

Error: 1: Extra content at the end of the document

我也尝试了 xml2 包,结果相同。

你有办法解决吗?

提前致谢。

免责声明:XML 不是我的工作领域,下面的代码可能不是推荐的方法。但至少它有效。

在 xml 文件的开头添加新标签,例如 <wikidump>,在结尾添加 </wikidump>。例如你的文件的开头变成:

<wikidump>
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="fr" />
  <siteinfo>
    <sitename>Wikipédia</sitename>
....

最后看起来像

      <sha1>9smdmhiguf5lxyrfqxq2j6m66tq65y9</sha1>
    </revision>
  </page>
</wikidump>

那么这段代码可以毫无问题地读取xml对象:

library(XML)
wikidata <- xmlParse("test.xml")

如果需要

,您可以通过编程方式添加这两行 <wikidump>
# open a new file test2.xml for writing
xmlfile <- file("test2.xml","w")
writeLines("<wikidump>", xmlfile)
# add content of test.xml
writeLines(readLines("test.xml"), xmlfile)
writeLines("</wikidump>", xmlfile)
close(xmlfile)

像这样使用htmlTreeParse。 (为了可重复性,我们在末尾的注释中使用 Lines。)

library(XML)
doc <- htmlTreeParse(Lines, asText = TRUE, useInternalNodes = TRUE)

# test it by extracting all contributors
xpathSApply(xmlRoot(doc), "//contributor", xmlValue)
## [1] "RobokoBot2090299" "Anareth2426186"   "Prospaire2133855"

注意:使用了此输入:

Lines <- '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="fr" />
  <siteinfo>
    <sitename>Wikipédia</sitename>
    <dbname>frwiki</dbname>
    <base>https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal</base>
    <generator>MediaWiki 1.27.0-wmf.15</generator>
    <case>first-letter</case>
    <namespaces>
      <namespace key="-2" case="first-letter">Média</namespace>
      <namespace key="-1" case="first-letter">Spécial</namespace>
      <namespace key="0" case="first-letter" />
      <namespace key="1" case="first-letter">Discussion</namespace>
      <namespace key="2" case="first-letter">Utilisateur</namespace>
      <namespace key="3" case="first-letter">Discussion utilisateur</namespace>
      <namespace key="4" case="first-letter">Wikipédia</namespace>
      <namespace key="5" case="first-letter">Discussion Wikipédia</namespace>
      <namespace key="6" case="first-letter">Fichier</namespace>
      <namespace key="7" case="first-letter">Discussion fichier</namespace>
      <namespace key="8" case="first-letter">MediaWiki</namespace>
      <namespace key="9" case="first-letter">Discussion MediaWiki</namespace>
      <namespace key="10" case="first-letter">Modèle</namespace>
      <namespace key="11" case="first-letter">Discussion modèle</namespace>
      <namespace key="12" case="first-letter">Aide</namespace>
      <namespace key="13" case="first-letter">Discussion aide</namespace>
      <namespace key="14" case="first-letter">Catégorie</namespace>
      <namespace key="15" case="first-letter">Discussion catégorie</namespace>
      <namespace key="100" case="first-letter">Portail</namespace>
      <namespace key="101" case="first-letter">Discussion Portail</namespace>
      <namespace key="102" case="first-letter">Projet</namespace>
      <namespace key="103" case="first-letter">Discussion Projet</namespace>
      <namespace key="104" case="first-letter">Référence</namespace>
      <namespace key="105" case="first-letter">Discussion Référence</namespace>
      <namespace key="828" case="first-letter">Module</namespace>
      <namespace key="829" case="first-letter">Discussion module</namespace>
      <namespace key="2300" case="first-letter">Gadget</namespace>
      <namespace key="2301" case="first-letter">Gadget talk</namespace>
      <namespace key="2302" case="case-sensitive">Gadget definition</namespace>
      <namespace key="2303" case="case-sensitive">Gadget definition talk</namespace>
      <namespace key="2600" case="first-letter">Sujet</namespace>
    </namespaces>
  </siteinfo>
  <page>
    <title>Antoine Meillet</title>
    <ns>0</ns>
    <id>3</id>
    <revision>
      <id>123903866</id>
      <parentid>123513568</parentid>
      <timestamp>2016-03-02T15:50:55Z</timestamp>
      <contributor>
        <username>RobokoBot</username>
        <id>2090299</id>
      </contributor>
      <minor/>
      <comment>Ajout d\'une puce avant {{Autorité}} suite à la modification du modèle</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text id="123933672" bytes="9683" />
      <sha1>f9e9rj6s5eistpyimc4xqrtauni5uc3</sha1>
    </revision>
  </page>
  <page>
    <title>Algèbre linéaire</title>
    <ns>0</ns>
    <id>7</id>
    <revision>
      <id>123705494</id>
      <parentid>121738150</parentid>
      <timestamp>2016-02-25T16:21:28Z</timestamp>
      <contributor>
        <username>Anareth</username>
        <id>2426186</id>
      </contributor>
      <minor/>
      <comment>/* Histoire */ grammaire</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text id="123731807" bytes="17107" />
      <sha1>iewjt56i5p1bhxup95b9bp08r5u0t9u</sha1>
    </revision>
  </page>
  <page>
    <title>Algèbre générale</title>
    <ns>0</ns>
    <id>9</id>
    <revision>
      <id>116367254</id>
      <parentid>109545698</parentid>
      <timestamp>2015-06-28T08:36:29Z</timestamp>
      <contributor>
        <username>Prospaire</username>
        <id>2133855</id>
      </contributor>
      <comment>divers</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text id="116305869" bytes="1965" />
      <sha1>9smdmhiguf5lxyrfqxq2j6m66tq65y9</sha1>
    </revision>
  </page>'