如何在xpath结果中到达所需节点?

时间:2012-12-12 15:17:45

标签: php xml xpath web-scraping simplexml

正如我在问题标题中所提到的,我正在尝试使用下面的代码来到达xpath结果中的所需节点。

<?php
$xpath = '//*[@id="topsection"]/div[3]/div[2]/div[1]/div/div[1]';          
$html = new DOMDocument();
@$html->loadHTMLFile('http://www.flipkart.com/samsung-galaxy-ace-s5830/p/itmdfndpgz4nbuft');
$xml = simplexml_import_dom($html);   
if (!$xml) {
    echo 'Error while parsing the document';
    exit;
}

$source = $xml->xpath($xpath);
echo "<pre>";
print_r($source);
?>

这是源代码。我用来取消电子商务的价格。 它起作用,它给出了以下输出:

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => line
                )

            [div] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [class] => prices
                            [itemprop] => offers
                            [itemscope] => 
                            [itemtype] => http://schema.org/Offer
                        )

                    [span] =>  Rs. 10300
                    [div] => (Prices inclusive of taxes)
                    [meta] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [itemprop] => price
                                            [content] => Rs. 10300
                                        )

                                )

                            [1] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [itemprop] => priceCurrency
                                            [content] => INR
                                        )

                                )

                        )

                )

        )

)

现在如何直达[content] =&gt;卢比。 10300。 我试过了:

echo $source[0]['div']['meta']['@attributes']['content']

但它不起作用。

2 个答案:

答案 0 :(得分:1)

尝试echo (String) $source[0]->div->meta[0]['content'];

基本上,当你看到一个元素是一个对象时,你不能像数组一样访问它,你需要使用对象->方法。

答案 1 :(得分:0)

SimpleXMLElementprint_r未显示真实的对象结构。所以你需要掌握一些知识:

$source[0]->div->meta['content']
        |    |     |      `- attribute acccess
        |    |     `- element access, defaults to the first one
        |    `- element access, defaults to the first one
        |
 standard array access to get 
 the first SimpleXMLElement of xpath()
 operation

那个示例就是(带有你的地址)以下内容(print_r再次,Demo):

SimpleXMLElement Object
(
    [0] => Rs. 10300
)

如果您需要文本值,请将其投射到字符串:

$rs = (string) $source[0]->div->meta['content'];

但是,您已经可以使用xpath表达式直接访问该节点(如果是单个案例)。

详细了解如何访问Basic SimpleXML usage ExamplesDocs中的SimpleXMLElement