无法从网站上抓取内容

lov*_*esh 6 php xhtml xml-namespaces domxpath web-scraping

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

$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
Run Code Online (Sandbox Code Playgroud)

我确定上面的xpath代码有问题.这xpaths是正确的.我已经检查了上面xpaths的内容FirePath (a firefox addon).我知道我错过了一些非常愚蠢的东西,但我无法理解.请帮忙.我已经检查了类似的代码来抓取链接Wikipedia(绝对xpaths是不同的),它很好地工作.所以我不明白为什么上面的代码不适用于另一个URLs.我正在清理HTML内容,Tidy所以我没有问题xpath没有geeting HTML权利?我已经检查的长度nodelist后, $item1=$xpath->query($path1)这是0这意味着什么用走错了$xpath->query,因为xpaths是正确的,因为我已经检查与FirePath 我已经修改我的代码位的指出和使用loadXML代替loadHTML.但这给了我错误,Entity 'nbsp' not defined in Entity因此我使用了替换实体的libxml选项LIBXML_NOENT,但仍然存在错误.

Tom*_*lak 5

是的,你缺少一些非常基本的东西:它是XHTML,所以你必须注册(并使用!)正确的命名空间才能获得结果.

$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);
Run Code Online (Sandbox Code Playgroud)


lov*_*esh 1

这个问题提醒我,很多时候问题的解决在于简单而不是复杂。我正在尝试namespaceserror corrections等等,但解决方案只需要仔细检查代码。我的代码的问题是loadHTML()和的顺序xpath initialization。最初的订单是

$xpath=new DOMXPath($page);
$page->loadHTML($content);
Run Code Online (Sandbox Code Playgroud)

通过这样做,我实际上是xapth在初始化一个空文档。dom现在通过首先加载html然后初始化来颠倒顺序xpath我能够获得所需的结果。另外,正如建议的那样,通过tbodyxpathas 中删除元素firefox会自动插入它。所以正确的xpath应该是

$path1="//body/table[4]/tr[3]/td[4]";
$path2="//body/table[4]/tr[1]/td[4]";
Run Code Online (Sandbox Code Playgroud)

感谢大家的建议和承受。