这个xPath有点帮助吗?

时间:2011-03-25 15:54:08

标签: php dom xpath

我从RSS获得了一些信息。

<?php
$dom = new DOMDocument;
libxml_use_internal_errors(TRUE);
$dom->load('http://www.myrss.com');
libxml_clear_errors();

$xPath = new DOMXPath($dom);
$links = $xPath->query('xxxxx');
foreach($links as $link) {
    printf("%s \n", $link->nodeValue);
}
?>

我已设法通过//item/title获取标题,链接和说明,依此类推,我希望如何分离文字内容和描述图片。

正如我可以使用firefox查看页面源代码,这是我看到的图像和内容的代码。两者都在<description></description>

图片

<div class="separator" style="clear: both; text-align: center;"><a href="LINK TO IMAGE" imageanchor="1" 
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="192" 
src="LINK TO IMAGE" width="320" /></a></div>

内容文字

<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"> CONTENT TEXT IS HERE </span>

我应该使用什么xPath来获取这些数据?谢谢

3 个答案:

答案 0 :(得分:0)

您的代码格式不正确,因此其他人很难对其进行处理。

但是,此处的交互式工具:http://www.bubasoft.net/(XPath Builder)在构建XPath查询时非常有用。

答案 1 :(得分:0)

看起来内容已编码/转义,因此您无法使用Xpath查询它,因为它不是HTML / XML。 Take at htmlentities and html_entity_decode

您应该提取内容,将其转换为HTML / XML并将其单独加载到DOM文档中。然后你可以使用Xpath查询它。

答案 2 :(得分:0)

如果它看起来像并且内容是HTML编码的,则不能一步完成。您必须检索每个描述文本并解析为自己的DOM (除非您想使用正则表达式,我强烈反对)

如有疑问,您可以先通过TidyDOMDocumentloadHTML(),非常有弹性,但无法保证它可以加载任何 HTML。

// beware, this is untested. it should give you an idea, though.

$dom = new DOMDocument;
libxml_use_internal_errors(TRUE);

$dom->load('http://www.myrss.com');
libxml_clear_errors();

$xPath = new DOMXPath($dom);
$items = $xPath->query('/rss/channel/item');

foreach($items as $item) {
    $descr = $xPath->query('./description', $item);
    // there should be at most one, but foreach gracefully
    // handles the case where there is no <description>
    foreach ($descr as $d) {
        $temp_dom = new DOMDocument();
        $temp_dom->loadHTML( $d->nodeValue );   // error handling/Tidy here!

        $temp_xpath = new DOMXPath($temp_dom);

        $img = $temp_xpath->query('//img');
        $txt = $temp_xpath->query('//span[@class="Apple-style-span"]');

        // now do something with $img and $txt
    }

}