php – 无法从网站上抓取内容

前端之家收集整理的这篇文章主要介绍了php – 无法从网站上抓取内容前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从网站上删除一些内容,但下面的代码不起作用(没有显示任何输出).
这是代码
$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代码有问题. xpath是正确的.我用FirePath(firefox插件)检查了上面的xpath.我知道我错过了一些非常愚蠢的东西,但我无法理解.请帮忙.
我已经检查过类似的代码来抓取来自维基百科的链接(绝对是xpaths不同)并且它运行良好.
所以我不明白为什么上面的代码不适用于其他URL.我正在使用Tidy清理HTML内容,所以我不存在xpath没有问题HTML的问题吗?
我在$item1 = $xpath->查询($path1)之后检查了节点列表的长度,这是0,这意味着$xpath->查询出错了,因为xpath是正确的,因为我已经检查过FirePath
我已经修改了我的代码,并指出并使用了loadXML而不是loadHTML.
但这给了我错误,因为实体没有在实体中定义,因此我使用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);

猜你在找的PHP相关文章