簡體   English   中英

PHP Xpath:通過類名稱獲取節點值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM