无法从html页面获取表数据

时间:2011-06-08 18:20:14

标签: php html curl xpath web-scraping

我正在尝试在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没有做的就是工作。

2 个答案:

答案 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更改。