我正在尝试从网站上抓取一些内容,但是下面的代码不起作用(未显示任何输出)。
这是代码
$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);