将MediaWiki的输出转换为纯文本

时间:2016-06-11 12:32:48

标签: json bash raspberry-pi

使用MediaWiki API,this为我提供了类似的输出,搜索词为Tiger

https://simple.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Tiger&format=json&exintro=1

响应:

{"batchcomplete":"","query":{"pages":{"9796":{"pageid":9796,"ns":0,"title":"Tiger","extract":"<p>The <b>tiger</b> (<i>Panthera tigris</i>) is a carnivorous mammal. It is the largest living member of the cat family, the Felidae. It lives in Asia, mainly India, Bhutan, China and Siberia.</p>\n<p></p>"}}}}

如何获得输出

  

虎(Panthera tigris)是一种食肉哺乳动物。它是猫科动物猫科动物中最大的活体成员。它生活在亚洲,主要是印度,不丹,中国和西伯利亚。

有人也可以告诉我如何将所有内容存储在文本文件中吗?我是初学者,所以请你好。我需要这个用于我在Bash中进行的项目,在Raspberry Pi 2上,使用Raspbian

3 个答案:

答案 0 :(得分:1)

通常建议使用JSON解析器来处理JSON,我喜欢的是jq

% jq -r '.query.pages[].extract' file
<p>The <b>tiger</b> (<i>Panthera tigris</i>) is a carnivorous mammal. It is the largest living member of the cat family, the Felidae. It lives in Asia, mainly India, Bhutan, China and Siberia.</p>
<p></p>

要删除HTML标记,您可以执行以下操作:

... | sed 's/<[^>]*>//g'

将删除不在续行中的HTML标记:

% jq -r '.query.pages[].extract' file | sed 's/<[^>]*>//g'
The tiger (Panthera tigris) is a carnivorous mammal. It is the largest living member of the cat family, the Felidae. It lives in Asia, mainly India, Bhutan, China and Siberia.

file是存储JSON的文件,例如:

curl -so - 'https://simple.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Tiger&format=json&exintro=1' > file
jq '...' file

jq '...' <(curl -so - 'https://simple.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Tiger&format=json&exintro=1')

您可以使用以下代码安装jq

sudo apt-get install jq

对于您的示例输入,您还可以将grep-P(PCRE)一起使用。但建议使用上面适当的JSON解析器

grep -oP '(?<=extract":").*?(?=(?<!\\)")' file 
<p>The <b>tiger</b> (<i>Panthera tigris</i>) is a carnivorous mammal. It is the largest living member of the cat family, the Felidae. It lives in Asia, mainly India, Bhutan, China and Siberia.</p>\n<p></p>

答案 1 :(得分:1)

如果你正在使用PHP,你可以很容易地完成它,如下所示。

访问文本

我们知道文本存储在extract属性中,因此我们需要访问它。

执行此操作的最简单方法是将API中的字符串解析为对象格式,这是使用PHP中的json_decode方法完成的。然后,您可以从该对象访问extract属性,这将为您提供字符串。代码将是这样的:

//Get the string from the API, however you've already done it
$JSONString = getFromAPI();

//Use the inbuilt method to create a JSON object
$JSONObject = json_decode($JSONString);

//Follow the structure to get the pages property
$Pages = JSONObject->query->pages;

//Here, we don't know what the Page ID is (because the MediaWiki API returns a different number, depending on the page)
//Therefore we need to simply get the first key, and within it should be our desired 'extract' key
$Extract = "";
foreach($Pages as $value) {
    $Extract = $value->extract;
    break;
}

//$Extract now contains our desired text

将其写入文件

现在我们需要将$Extract的内容写入文件,如您所述。这可以通过使用file_put_contents方法完成如下。

//Can be anything you want
$file = 'APIResult.txt';

// Write the contents to the file, 
// using the LOCK_EX flag to prevent anyone else writing to the file at the same time
file_put_contents($file, $Extract, LOCK_EX);

Aaand我们已经完成了!

<强> 文档
这些功能的文档(json_decodefile_put_contents)可在以下网址找到:

答案 2 :(得分:0)

你可能会发现pandoc很有帮助,来自http://pandoc.org/ - 它可以理解包括Mediawiki在内的输入上的多种文件格式,并且在输出上还有一堆文件格式,包括纯文本。它更像是“瑞士军刀”的方法,而且由于Mediawiki任意复杂的解析,你会想要使用这样的东西,这是通过一个大的测试套件。