繁体   English   中英

使用domxpath解析一些复杂的嵌套html

[英]Using domxpath to parse a some complex nested html

我在解决如何从比我在网上找到的示例要复杂得多的html页面中获取某些文本元素的问题。

我要解析的站点是一个房地产网站,在html中,它们具有诸如房地产的价格和状态之类的信息。 如果我们以物业的状态为例,我试图从以下html片段中获取“待售”:

<div class="repeating container of property details">
<div class="firstlevel other class too">
    <div class="secondlevel other class too">
        <div class="thirdlevel">
            <div class="fourthlevel">
                <span class="thisspan">For Sale</span>
                <span class="someotherspan">Something else</span>
            </div>
        </div>
    </div>
</div>

然后使用以下php,尝试提取所需的内容。

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);

$properties = $xpath->query('//div[@class="repeating container of property details"]');

foreach($properties as $container) {

    $node = $xpath->query('div[@class="firstlevel other class too"]'
        . '/div[@class="secondlevel other class too"]'
        . '/div[@class="thirdlevel"]'
        . '/div[@class="fourthlevel"]'
        . '/span[@class="thisspan"]', $container); // returns a DOMNodeList  
    $result = $node->item(0)->value; // get the first node in the list which is a DOMAttr
    echo 'value: '.$result.'<br/>';
}

但我收到以下错误:

Undefined property: DOMElement::$value

显然,这并不是在选择我要掌握的内容,到目前为止,我尝试过的其他方法似乎都没有用。 谁能指出我正确的方向?

您正在获取元素节点( span ),而不是属性节点。 元素节点没有$value属性。 使用$textContent属性:

$result = $node->item(0)->textContent;

或者,您将节点列表转换为Xpath表达式中的字符串:

$result = $xpath->evaluate('string(div[@class="firstlevel other class too"]'
    . '/div[@class="secondlevel other class too"]'
    . '/div[@class="thirdlevel"]'
    . '/div[@class="fourthlevel"]'
    . '/span[@class="thisspan"])', $container); // returns a DOMNodeList  
echo 'value: '.$result.'<br/>';

这仅适用于DOMXpath::evaluate()DOMXpath::query()仅支持返回节点列表的表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM