我正在尝试在html网页的表格中获取一些数据字段。在发布一些内容时动态生成网页。我使用php-curl
获取网页,然后使用xpath
获取某些字段的数据。我能够获取页面而不是特定字段。代码看起来像这样
$url="http://www.rtu.ac.in/results/reformat.php";
$post="rollnumber=08epccs060&filename=fetchmodulesem_4_btech410m.php&button=Submit";
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
curl_close($ch);
$totalPath="html/body/table[4]/tbody/tr[3]/td[4]";
$page=new DOMDocument();
$xpath=new DOMXPath($page);
$page->loadHTML($content);
$page->saveHTML(); // this shows the page contents
$total=$xpath->query($totalPath);
echo $total->length; //shows 0
echo $total->item(0)->nodeValue; //shows nothing
xpath
是正确的,因为我已使用FirePath
进行了检查。我从中理解的是$xpath->query
没有做的就是工作。
答案 0 :(得分:3)
你写道:
echo $total->length; //shows 0
这意味着xpath返回0个元素。所以它实际上没有做你想做的事。
//html/body/table[4]/tr[3]/td[4]
或以其他方式检查您没有出错的xpath查询的语法。
此外,我首先加载HTML文档,然后初始化xpath对象。
$totalPath="//html/body/table[4]/tr[3]/td[4]";
$page=new DOMDocument();
$page->loadHTML($content);
$xpath=new DOMXPath($page);
$total=$xpath->query($totalPath);
编辑:按照Wrikken的建议删除了tbody。
编辑:启用错误报告。警告,以便您可以确保a)HTML正确加载到DomDocument中,以及b)如果您看到XPath有问题。
让它运行。这是我的代码:
<?php
$url="http://www.rtu.ac.in/results/reformat.php";
$post="rollnumber=08epccs060&filename=fetchmodulesem_4_btech410m.php&button=Submit";
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
curl_close($ch);
echo 'Size: ', strlen($content), "\n";
echo 'Beginning: ', substr($content, 0, 512), "\n\n";
$page=new DOMDocument();
$page->recover=false;
$page->loadHTML($content);
echo "\nLoaded XML:\n", $page->saveXML($page), "\n";
$xpath=new DOMXPath($page);
$totalPath="html/body/table[4]/tbody/tr[3]/td[4]";
$paths = array(
'//body',
'//body/table',
'//body/table[4]',
'//body/table[4]/tr',
'//body/table[4]/tr[3]',
'//body/table[4]/tr[3]/td',
'//body/table[4]/tr[3]/td[4]',
'//html/body/table[4]/tr[3]/td[4]',
);
foreach($paths as $path) {
$result=$xpath->query($path);
echo $path, ': ', $result->length, "\n";
}
这是输出(切割顶部输出仅用于加载验证):
//body: 1
//body/table: 4
//body/table[4]: 1
//body/table[4]/tr: 3
//body/table[4]/tr[3]: 1
//body/table[4]/tr[3]/td: 4
//body/table[4]/tr[3]/td[4]: 1
//html/body/table[4]/tr[3]/td[4]: 1
始终返回一个长度,意味着至少有一个节点。
答案 1 :(得分:1)
不看HTML:/tbody
不存在,只是由Firefox添加。删除该部分,并获得对该工具的健康不信任;)
修改强>:
确实顺序应该是:
$page=new DOMDocument();
$page->loadHTML($content);
$xpath=new DOMXPath($page);
当DOMXpath获取快照时,它不会跟踪DOM更改。