我正在建立一个不断变化的数据的网站,我想使用维基百科的数据将有助于更新我的网站。然而,在搞砸了我创建的一些东西来提取这些内容后,我遇到了一些问题。
有一个<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
答案 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
中找到该正则表达式的所有匹配项。第一个组将是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>
答案 1 :(得分:1)
你有两个方法来解决这个问题。
这实际上取决于您选择的方法。选择一种方法,如果您有任何问题,请告诉我。您可以在没有问题的情况下找到这两种方法的教程。
据我所知,使用API会更好,而不是依赖于DOM结构,因为它们往往会经常变化。