我正在从远程网站提取数据,我需要在每个表列中获取数据。
这里是数据样本
<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">£30</td>
<td sorttable_customkey="-128">£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>°</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,以便可以导入数据
努力解释我要做什么(希望有人会理解我要说的话)
答案 0 :(得分:0)
不要浪费自己的时间编写网页抓取工具...使用现成的解决方案,例如,这个https://github.com/FriendsOfPHP/Goutte或更简单的https://symfony.com/doc/current/components/dom_crawler.html
答案 1 :(得分:0)
刚刚意识到我可以使用
preg_replace('/<td (.*?)>(.*?)<\/td>/', '$2,', $str);
使用多个通配符,然后将第二个实例中的数据插入到我想要的位置