2011-02-02 61 views
1

我想要检索位于此span类属性中的正文文本。使用DOM解析PHP(无结果)

<span id="" style="color:#525B64;">The quick brown fox jumped over the lazy dog.</span> 

我在我的网络服务器上测试过它,我没有收到任何错误,但是网页是空白的。我对此很陌生,所以我不知道该从哪里出发。

这是我的代码。

<?php 
// Load remote file, supress parse errors 
libxml_use_internal_errors(TRUE); 
$dom = new DOMDocument; 
$dom->loadHTMLFile('http://somewebpage.com'); 
libxml_clear_errors(); 

// use XPath to find all nodes with a class attribute of header 
$xp = new DOMXpath($dom); 
$nodes = $xp->query('//span[@class="msgBody"]'); 

// output first item's content 
echo $nodes->item(0)->nodeValue; 
?> 
+0

什么是您试图访问的实际页面?据我所知,此代码有效。 – lonesomeday 2011-02-02 01:24:51

回答

3

在此代码中一切看起来不错。

我想尝试做的是:

  • 除去supresses解析错误的行。
  • 负载看到file_get_contents远程文件,如果使用XPath正确加载
  • 查询文档一样//*和遍历导致DOMNodeList(用foreach),看看树是否正确建立。

Btw。为了抑制由->loadHTMLFile()方法报告的解析错误,我使用了@运算符。

+1

个人来说,为了抑制loadHTMLFile()报告的解析错误,我修复了错误。 ;-) – Wiseguy 2011-02-02 01:27:52

+0

Wiseguy,你无法修复你正在解析的远程文档上的错误... – mateusza 2011-02-02 01:29:22

+0

嗯,这是一个公平的陈述。感谢您在我的阅兵式上下雨。 – Wiseguy 2011-02-02 01:30:18

1

DOM为everthing创建节点:属性,文本,注释,元素,您将其命名。因此,即使看起来像这样,你并没有看到跨度节点的值,但实际上你希望在该跨度内获得TextNode,并取而代之为值。尝试是这样的:

echo $nodes->item(0)->childNodes->item(0)->nodeValue 

您也可以直接从XPath查询得到这样的:

$nodes = $xp->query('//span[@class="msgBody"]/text()'); 

(虽然我从来没有使用XPath多少运气,个人)

1

你确定在你正在解析的文档中,这个类只有一个span元素?

也许->item(0)返回空元素,所需的元素是下一个列表?

1

很多时候,这种行为是由于默认命名空间(请检查是否有类似于此的:xmlhs="http://www.w3.org/1999/xhtml")。

在XPath表达式中使用默认名称空间中的元素名称是xpath标记中最常见的FAQ - 只需搜索“xpath默认名称空间”即可找到许多好的答案。