我正在尝试从网站上抓取一些内容,但是下面的代码不起作用(未显示任何输出)。
这是代码

$url="some url";
$otherHeaders="";   //here i am using some other headers like content-type,userAgent,etc
some curl to get the webpage
...
..
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);curl_close($ch);

$page=new DOMDocument();
$xpath=new DOMXPath($page);
$content=getXHTML($content);  //this is a tidy function to convert bad html to xhtml
$page->loadHTML($content);    // its okay till here when i echo $page->saveHTML the page is displayed

$path1="//body/table[4]/tbody/tr[3]/td[4]";
$path2="//body/table[4]/tbody/tr[1]/td[4]";

$item1=$xpath->query($path1);
$item2=$xpath->query($path2);

echo $item1->length;      //this shows zero
echo $item2->length;      //this shows zero

foreach($item1 as $t)
echo $t->nodeValue;    //doesnt show anything
foreach($item2 as $p)
echo $p->nodeValue;    //doesnt show anything

我确定上述xpath代码有问题。 xpaths是正确的。我已经用xpaths检查了上面的FirePath (a firefox addon)。我知道我在这里错过了一些非常愚蠢的东西,但是我看不出来。请帮忙。
我已经检查了类似的代码来从Wikipedia抓取链接(肯定xpaths是不同的),并且效果很好。
所以我不明白为什么上面的代码对其他URLs不起作用。我正在用HTML清洁Tidy内容,所以我不认为xpath无法正确处理HTML是没有问题的吗?
我已经检查了nodelist之后的$item1=$xpath->query($path1)的长度,这是0,这意味着$xpath->query出了点问题,因为xpaths是正确的,因为我已经使用FirePath检查了
我已经指出了一些修改代码,并使用loadXML而不是loadHTML
但这给了我Entity 'nbsp' not defined in Entity的错误,所以我使用libxml选项LIBXML_NOENT替换了实体,但错误仍然存​​在。

最佳答案

是的,您缺少了一些非常基本的东西:它是XHTML,因此您必须注册(并使用!)正确的namespace,然后才能期望得到结果。

$xpath->registerNamespace('x', 'http://www.w3.org/1999/xhtml');

$path1="//x:body/x:table[4]/x:tbody/x:tr[3]/x:td[4]";
$path2="//x:body/x:table[4]/x:tbody/x:tr[1]/x:td[4]";

$item1=$xpath->query($path1);
$item2=$xpath->query($path2);

10-08 02:56