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

标签 php xhtml web-scraping xml-namespaces domxpath

我试图从网站上删除一些内容,但下面的代码不起作用(不显示任何输出)。 这是代码

$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 插件) 检查了上面的 xpaths。我知道我在这里错过了一些非常愚蠢的东西,但我无法弄清楚。请帮忙。 我已经检查了类似的代码,用于从Wikipedia抓取链接(肯定xpaths是不同的)并且它工作得很好。 所以我不明白为什么上面的代码不适用于其他URL。我正在使用 Tidy 清理 HTML 内容,所以我不认为 xpath 没有正确获取 HTML 的问题? 我检查了 $item1=$xpath->query($path1) 之后 nodelist 的长度,它是 0 这意味着有事情发生$xpath->query 错误,因为 xpaths 是正确的,因为我已使用 FirePath 检查过 我按照指出的那样修改了我的代码,并使用 loadXML 而不是 loadHTML。 但这给了我错误,因为Entity 'nbsp'未在实体中定义,所以我使用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 - 无法从网站上抓取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6168558/

相关文章:

没有提交按钮的 HTML 表单提交

javascript - 如何绑定(bind)在 jquery 调用函数的选择菜单中定义的 onchange 事件?

php - 无法用数据库中的内容替换 php 中的\n

php - 将 POST 后的表单值保留为 python 文件的参数

android - 是否可以为 Android 应用程序使用 XHTML 设计而不是 XML 设计?

java - 网页抓取 Java 初学者

python - 没有 BS4 python 类的刮表

python - 如何使用Scrapy追踪深度为2的链接?

php - 使用 for 循环将数组插入表中

php - 什么是全页缓存