从维基百科中提取内容

时间:2013-04-28 04:34:28

标签: php

我正在建立一个不断变化的数据的网站,我想使用维基百科的数据将有助于更新我的网站。然而,在搞砸了我创建的一些东西来提取这些内容后,我遇到了一些问题。

有一个<td>包含我需要选择的一些信息,但它没有ID或任何特殊的信息。

以下是我需要选择的维基百科页面上的表格行

<tr class="">
<th scope="row" style="text-align:left; font-weight: normal"><b>Total</b></th>
<td class="" style="">36</td>
</tr>

我需要从<td>中提取 36 。关于此事的任何想法?

此处还有维基百科页面http://en.wikipedia.org/wiki/Nick_Diaz

2 个答案:

答案 0 :(得分:6)

首先,使用API​​将wikitext刮成JSON。通过获取此URL来执行此操作:

https://en.wikipedia.org/w/api.php?action=parse&page=Nick_Diaz&prop=wikitext&format=json

然后,假设结果在$data,请执行以下操作:

$data = json_decode($data, true);
$data = $data['parse']['wikitext']['*'];

现在所有的wikitext都在$data。恰好,总计是从五个领域计算出来的:

  • mma_kowin - 淘汰赛
  • mma_subwin - 提交
  • mma_decwin - 决定
  • mma_dqwin - 取消资格
  • mma_otherwin - 其他

您可以使用正则表达式轻松解析这些字段:

/^\s*\|\s*mma_([a-z]+)win\s*=\s*(\d*)/m

您需要在$data中找到该正则表达式的所有匹配项。第一个组将是kosub等。第二个匹配将是数字的字符串表示形式或零字符串的空字符串。然后你会想要添加所有这些数字,而bam,你已经得到了它。

现在一起:

<?php

$data = file_get_contents("https://en.wikipedia.org/w/api.php?action=parse&page=Nick_Diaz&prop=wikitext&format=json");
$data = json_decode($data, true);
$data = $data['parse']['wikitext']['*'];

preg_match_all('/^\s*\|\s*mma_([a-z]+)win\s*=\s*(\d*)/m', $data, $matches, PREG_SET_ORDER);

$wins = array();
foreach($matches as $match) {
    $wins[$match[1]] = (int)$match[2];
}

?>
<h1>Nick Diaz's Wins</h1>
<table border="1">
    <tr><th>Means</th><th>Wins</th></tr>
    <tr><td>Knockout</td><td><?php echo $wins['ko']; ?></td></tr>
    <tr><td>Submission</td><td><?php echo $wins['sub']; ?></td></tr>
    <tr><td>Decision</td><td><?php echo $wins['dec']; ?></td></tr>
    <tr><td>Disqualification</td><td><?php echo $wins['dq']; ?></td></tr>
    <tr><td>Other</td><td><?php echo $wins['other']; ?></td></tr>
    <tr><td><strong>Total</strong></td><td><strong><?php echo array_sum($wins); ?></strong></td></tr>
</table>

答案 1 :(得分:1)

你有两个方法来解决这个问题。

  1. 使用维基百科的API - http://www.mediawiki.org/wiki/API:Tutorial
  2. 使用HTML解析器 - http://simplehtmldom.sourceforge.net/
  3. 这实际上取决于您选择的方法。选择一种方法,如果您有任何问题,请告诉我。您可以在没有问题的情况下找到这两种方法的教程。

    注意

    据我所知,使用API​​会更好,而不是依赖于DOM结构,因为它们往往会经常变化。