从 wikisource XML 转储文件中提取文本

时间:2021-06-14 04:09:16

标签: python xml

以下是马拉地语维基源转储文件的一部分。

我正在尝试提取匹配标记为“我的书”的标签的内容。 有什么容易实现的吗? Wikisouce 是一个流行的数据源,我想肯定有脚本/模块可以做到这一点。

 <page>
    <title>My book 1</title>
    <ns>0</ns>
    <id>413</id>
    <revision>
      <id>39062</id>
      <parentid>1660</parentid>
      <timestamp>2019-01-21T10:43:05Z</timestamp>
      <contributor>
        <username>Taiven2240</username>
        <id>1373</id>
      </contributor>
      <minor />
      <comment>मराठीकरण</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text bytes="215367" xml:space="preserve">{{some Info
}}
&lt;poem&gt;
[[वर्ग:अध्यात्मिक]]
[[वर्ग:तपासणी करायचे साहित्य‎]]</text>
      <sha1>kkx0i4d2tm0zehb5wumrgs60lhric2v</sha1>
    </revision>
  </page>

什么是 bytes="215367"?

我从以下位置下载此文件:

https://dumps.wikimedia.org/mrwikisource/20210601/mrwikisource-20210601-pages-meta-current.xml.bz2

1 个答案:

答案 0 :(得分:1)

一个简单但效率不高的方法是在 bash 命令行上使用 xmllint,因为它是一个 300MB 的未压缩文件。易于使用 Cygwin 在 Windows 上安装,默认情况下存在于 Linux(和 MacOs 我猜:-p)。 一个简单的脚本,用于一次性搜索 title 标签上的 2 个不同字符串并显示 text 标签内容。

#!/bin/bash

title1=":Ansumang"
title2=":Marathi"

time xmllint --shell mrwikisource-20210601-pages-meta-current.xml <<EOF
setns x=http://www.mediawiki.org/xml/export-0.10/
cat //x:page[x:title[contains(text(),"$title1")] | x:title[contains(text(),"$title2")]]/x:title/text()
EOF

结果:

/ > setns x=http://www.mediawiki.org/xml/export-0.10/
/ > cat //x:page[x:title[contains(text(),":Ansumang")] | x:title[contains(text(),":Marathi")]]/x:title/text()
 -------
सदस्य:Ansumang
 -------
वर्ग:Marathi
 -------
सदस्य चर्चा:Marathipremi101
 -------
चित्र:MarathiTypingCert-1.png
 -------
विकिस्रोत:Marathi Typing Test
 -------
विकिस्रोत:Marathi Font Typing Test
 -------
विकिस्रोत:Marathi font typing test
 -------
विकिस्रोत:Marathi typing speed test
 -------
सदस्य चर्चा:MarathiBot
/ >
real    0m3.223s
user    0m2.904s
sys     0m0.312s

要获取 revision/text 标签,请使用:

cat //x:page[x:title[contains(text(),"$title1")] | x:title[contains(text(),"$title2")]]/x:revision/x:text/text()

单行是

(t1=':Ansumang'; t2=':Marathi' ; echo 'setns x=http://www.mediawiki.org/xml/export-0.10/'; echo "cat //x:page[x:title[contains(text(),'$t1')] | x:title[contains(text(),'$t2')]]/x:title/text()") | xmllint --shell mrwikisource-20210601-pages-meta-current.xml ; echo

单线获得titlerevision/text

(t1=':Ansumang'; t2=':Marathi' ; echo 'setns x=http://www.mediawiki.org/xml/export-0.10/'; echo "cat //x:page[x:title[contains(text(),'$t1')] | x:title[contains(text(),'$t2')]]/descendant::*[self::x:title or self::x:text]/text()") | xmllint --shell mrwikisource-20210601-pages-meta-current.xml ; echo