如何使用PHP对HTML表进行web抓取



我正试图从下面的链接中抓取表,并将其放入数组中。

https://www.tradingview.com/markets/currencies/cross-rates-overview-prices/

我试过各种方法,但都做不好。

<?php
$htmlContent = file_get_contents("https://www.tradingview.com/markets/currencies/cross-rates-overview-prices/");

$DOM = new DOMDocument();
$DOM->loadHTML($htmlContent);
$Header = $DOM->getElementsByTagName('th');
$Detail = $DOM->getElementsByTagName('td');
//#Get header name of the table
foreach($Header as $NodeHeader) 
{
$aDataTableHeaderHTML[] = trim($NodeHeader->textContent);
}
//print_r($aDataTableHeaderHTML); die();
//#Get row data/detail table without header name as key
$i = 0;
$j = 0;
foreach($Detail as $sNodeDetail) 
{
$aDataTableDetailHTML[$j][] = trim($sNodeDetail->textContent);
$i = $i + 1;
$j = $i % count($aDataTableHeaderHTML) == 0 ? $j + 1 : $j;
}
//print_r($aDataTableDetailHTML); die();
//#Get row data/detail table with header name as key and outer array index as row number
for($i = 0; $i < count($aDataTableDetailHTML); $i++)
{
for($j = 0; $j < count($aDataTableHeaderHTML); $j++)
{
$aTempData[$i][$aDataTableHeaderHTML[$j]] = $aDataTableDetailHTML[$i][$j];
}
}
$aDataTableDetailHTML = $aTempData; unset($aTempData);
print_r($aDataTableDetailHTML); die();

这是错误输出:(注意,这些错误有很多行(

警告:DOMDocument::loadHTML((:标记svg在实体中无效,在C:\examplep\htdocs\Testing\scraper.php的第6行的第405行

警告:DOMDocument::loadHTML((:实体中的标记路径无效,第6行上C:\examplep\htdocs\Testing\scraper.php中的第405行

警告:第30行C:\examplep\htdocs\Testing\scraper.php中未定义的变量$aDataTableDetailHTML

致命错误:Uncaught TypeError:count((:参数#1($var(的类型必须为Countable|array,在C:\examplep\htdocs\Testing\scraper.php:30堆栈跟踪:#0{main}在第30行的C:\examplep\tdocs\Testing \ scraper.php中抛出

非常感谢您的帮助。

有两个问题:

  1. 错误来自于验证html。看看这个答案如何处理。

  2. 您感兴趣的实际html(表数据(不在源html中。它们是通过JavaScript创建的。要处理这类页面,您可以使用例如Selenium。关于如何在php中做到这一点,请参阅以下答案。

最新更新