使用 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>'
出于研究目的,我想解析一些来自法语维基百科的转储。这是我要解析的 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>'