我遇到的问题是如何从一个比我能找到的在线例子更复杂的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
显然没有选择我想要抓住的东西,到目前为止我所尝试的其他任何东西似乎都没有用。有人能指出我正确的方向吗?
答案 0 :(得分:0)
您正在获取元素节点(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()
仅支持返回节点列表的表达式。