-3

我正在建立一个数据不断变化的网站,我认为使用来自维基百科的数据将有助于更新我的网站。但是,在弄乱了我为提取这些内容而创建的一些东西之后,我遇到了一些问题。

有一个<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>有什么想法吗?

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

4

2 回答 2

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. 第一组将是ko,sub等。第二个匹配将是数字的字符串表示形式或零的空字符串。然后你会想把所有这些数字加起来,然后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>
于 2013-04-28T04:51:08.187 回答
1

你有两种方法可以解决这个问题。

  1. 使用维基百科的 API - http://www.mediawiki.org/wiki/API:Tutorial
  2. 使用 HTML 解析器 - http://simplehtmldom.sourceforge.net/

这实际上取决于您选择的方法。选择一种方法,如果您有任何问题,请告诉我。您可以在没有问题的情况下找到这两种方法的教程。

笔记

据我所知,使用 API 会比依赖 DOM 结构更好,因为它们往往会频繁更改。

于 2013-04-28T04:42:23.987 回答