使用R解析wikipedia转储时出错

使用R解析wikipedia转储时出错,r,mediawiki,wikipedia,xml2,R,Mediawiki,Wikipedia,Xml2,出于研究目的,我想解析一些来自法语维基百科的转储。下面是我要解析的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/x

出于研究目的,我想解析一些来自法语维基百科的转储。下面是我要解析的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>
我也尝试过使用xml2包,得到了相同的结果

你能找到解决办法吗


提前感谢。

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

在xml文件的开头和结尾添加一个新标记,例如
。例如,文件的开头变成:

<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>
9smdmhiguf5lxyrfqxq2j6m66tq65y9
然后,此代码可以毫无问题地读取xml对象:

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

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

在xml文件的开头和结尾添加一个新标记,例如
。例如,文件的开头变成:

<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>
9smdmhiguf5lxyrfqxq2j6m66tq65y9
然后,此代码可以毫无问题地读取xml对象:

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

wikidata像这样使用
htmlTreeParse
。(为了再现性,我们在结尾的注释中使用了
。)

库(XML)

doc像这样使用
htmlTreeParse
。(为了再现性,我们在结尾的注释中使用了
。)

库(XML)

doc查看此“XML只能有一个“文档实体”或“根”“您在XML中有一个
siteinfo
和三个
page
,但没有一个更高的根。请查看包装Wikipedia API的
WikipediR
包;如果您想使用
rvest
或任何您最喜欢的抓取/解析包进行解析,它可以为您清理一些结果,或者为您提供HTML。请参阅此“XML只能有一个“文档实体”或“根”您的xml中有一个
siteinfo
和三个
page
,没有更高的根;如果你想用
rvest
或任何你最喜欢的抓取/解析软件包进行解析,它可以帮你清理一下结果,或者给你提供HTML。谢谢,这似乎很管用。我还有一个问题要问:我对页面标题有一个编码问题,使用下面的xpath://page/title进行访问,我在给您的示例中解决了这个问题。你能找到一个方法将正确的编码添加到R中吗?这个问题只显示了一部分页面,但整个页面可能有一个
或类似的标记,将被提取。似乎没有,但我可以将其添加到R中吗?xmlTreeParse中有一个encoding=参数,可能是FALSE,也可能是“UTF-8”之类的编码或者其他一些编码——您必须进行实验以找到正确的编码。这可能会有帮助:谢谢,我用编码参数解决了这个问题。谢谢,这似乎有效。我还有一个问题要问:我对页面标题有一个编码问题,使用下面的xpath://page/title进行访问,我在给您的示例中解决了这个问题。你能找到一个方法将正确的编码添加到R中吗?这个问题只显示了一部分页面,但整个页面可能有一个
或类似的标记,将被提取。似乎没有,但我可以将其添加到R中吗?xmlTreeParse中有一个encoding=参数,可能是FALSE,也可能是“UTF-8”之类的编码或者其他一些编码——您必须进行实验以找到正确的编码。这可能会有帮助:谢谢,我使用编码参数解决了这个问题
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>'