[英]PHP Xpath: Get node value by class name
我正在使用xpath從一段HTML代碼中提取數據,並且除了一部分之外,我已經能夠提取大多數數據。
HTML的結構如下所示,但是可能只有一個li或兩個或所有三個li,所以我需要能夠通過類名來定位它。
<li>
<a href="http://www.website.com">Product URL</a>
</li>
<li>
<ul>
<li class="itemone">1</li>
<li class="itemtwo">2</li>
<li class="itemthree">3</li>
</ul>
</li>
已經使用xpath查詢檢索了此代碼,然后使用下面的PHP代碼段從xpath查詢的結果中提取更多數據。
$rawData = $xpath->query('//div[@id=\'products\']/ul/li[contains(@class, \'product\')]');
foreach($rawData as $data) {
$productRaw = $data->getElementsByTagName('li');
$productTitle = $productRaw[0]->getElementsByTagName('a')[0]->nodeValue;
$productRefCode = $productRaw[0]->getElementsByTagName('span')[0]->nodeValue;
$productPrice = $productRaw[1]->getElementsByTagName('li');
}
問題是$productPrice
,上面的行正在拉出下面的節點列表。
DOMNodeList Object
(
[length] => 3
)
我正在尋找以上節點列表中具有itemtwo
的類名的itemtwo
,我在$productRaw[1]
上使用了$xpath->query
,還嘗試了getElementsByClassName
但是沒有運氣,我嘗試了兩者以下的摘要沒有運氣。
$productPrice = $productRaw[1]->getElementsByTagName('li')->getElementsByClassName('itemtwo');
...
$productPrice = $productRaw[1]->query('//li[contains(@class, \'itemtwo\')]');
兩個片段均給出錯誤Fatal error: Call to undefined method DOMNodeList::getElementsByClassName()
和Fatal error: Call to undefined method DOMNodeList::query()
。
使用DOMXPath::query
,將XPath字符串作為第一個參數,將DOMNode
作為第二個參數,相對於某些DOMNode
上下文執行XPath,例如:
foreach($rawData as $data) {
$productRaw = $data->getElementsByTagName('li');
.....
$productPrice = $xpath->query('.//li[contains(@class, "itemtwo")]', $productRaw->item(1));
}
也可以使用.
在XPath表達式的開頭明確表示該表達式是相對於當前上下文節點的。
像這樣嗎
$str = '<li>
<a href="http://www.website.com">Product URL</a></li>
<li>
<ul>
<li class="itemone">1</li>
<li class="itemtwo">2</li>
<li class="itemthree">3</li>
</ul>
</li>';
$doc = new DOMDocument;
$doc->loadHTML($str);
$xpath = new DOMXPath($doc);
$productPrices = $xpath->query("//li[@class='itemtwo']");
foreach ($productPrices as $productPrice) {
print $productPrice->nodeValue."\n";
}
har07的答案是正確的,但它只返回了長度設置為3的節點列表,就像我已經用現有代碼接收到的那樣。
原始代碼:
$productPrice = $productRaw[1]->getElementsByTagName('li');
har07的建議:
$productPrice = $xpath->query('.//li[contains(@class, "itemtwo")]', $productRaw->item(1));
解決方案,它返回元素類名稱等於itemtwo
的節點值:
$productPrice = $xpath->query('.//li[contains(@class, \'itemtwo\')]', $productRaw[1])->item(1)->nodeValue;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.