从用file_get_contents抓取的HTML表中提取数据

时间:2019-03-15 10:50:21

标签: php

我正在从远程网站提取数据,我需要在每个表列中获取数据。

这里是数据样本

<tr>
    <td><a href="https://www.example.com/graphs/fruit-bonanza-fruit-betsafe.html" title="Fruit Bonanza: Fruit (Betsafe)">Bonanza: Fruit (B'safe)</a></td>
    <td sorttable_customkey="-48">&pound;30</td>
    <td sorttable_customkey="-128">&pound;80</td>
    <td sorttable_customkey="333331" style="background-color:#f0dd66; font-weight:bold;">3d, 20h</td>
    <td sorttable_customkey="-1541574886" style="background-color:#f0dd66; font-weight:bold;">128d, 2h ago</td>
    <td sorttable_customkey="-94">94<strong>&deg;</strong></td>
    <td sorttable_customkey="-500"><img src="https://www.example.com/imgs/green-check-small.gif"/></td>
    <td sorttable_customkey="-894">Maybe</td>
    </tr>

但是,在以下情况下,sorttable_customkey值在每个实例中都不同 所以我不知道该怎么做。 我必须从标记内部获取数据,因为页面上还有其他我不想要的元素。

这是我提取初始表数据的代码

$sample = file_get_contents('data/15-03-2019.php');
function getContents($str, $startDelimiter, $endDelimiter) {
  $contents = array();
  $startDelimiterLength = strlen($startDelimiter);
  $endDelimiterLength = strlen($endDelimiter);
  $startFrom = $contentStart = $contentEnd = 0;
  while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
    $contentStart += $startDelimiterLength;
    $contentEnd = strpos($str, $endDelimiter, $contentStart);
    if (false === $contentEnd) {
      break;
    }
    $contents[] = substr($str, $contentStart, $contentEnd - $contentStart);
    $startFrom = $contentEnd + $endDelimiterLength;
  }
  return $contents;
}

$array = getContents($sample, '<tbody>', '</tbody>');
  foreach($array as $link )
   {
    $removetr = str_replace('<tr>','',$link);
    $replacetr = str_replace('</tr>','<br>',$link);
    $removetd = str_replace('<td>','',$removetr);
    $replacetd = str_replace('</td>',',',$removetd);
    echo $link;
   }

我试图做一系列的str_replace删除标签 并将</td>替换为逗号,并将</tr>替换为< br>,但是由于可排序的自定义键的值不同(在页面下方一直是唯一的),因此不必说替换的不起作用 我的最终结果是我试图获取每列内的所有数据并有效创建CSV,以便可以导入数据

努力解释我要做什么(希望有人会理解我要说的话)

2 个答案:

答案 0 :(得分:0)

不要浪费自己的时间编写网页抓取工具...使用现成的解决方案,例如,这个https://github.com/FriendsOfPHP/Goutte或更简单的https://symfony.com/doc/current/components/dom_crawler.html

答案 1 :(得分:0)

刚刚意识到我可以使用

preg_replace('/<td (.*?)>(.*?)<\/td>/', '$2,', $str);

使用多个通配符,然后将第二个实例中的数据插入到我想要的位置