簡體   English   中英

PHP-DOMelement select不返回選項值

[英]PHP - DOMelement select does not return option values

我一直在嘗試通過使用DOMelements解析網站。 一切正常,除了這個問題對我來說沒有意義。

有一個選擇框,我需要所有可能的選項值的內容:

<select name="super_attribute[141]" id="attribute141" class="required-entry super-attribute-select">
    <option value="">Choose size</option>
    <option value="36" price="0">36</option>
    <option value="38" price="0">38</option>
    <option value="41" price="0">40</option>
    <option value="43" price="0">42</option>
    <option value="45" price="0">44</option>
    <option value="47" price="0">46</option>
    <option value="49" price="0">48</option>
</select>

我想檢索一個包含值的數組(innerHTML或'value'屬性)。 我使用以下代碼:

foreach ($dom->getElementsByTagName('option') as $option_tag) {
    $sizes_list[] = $option_tag->getAttribute('value');
}

但是,始終僅返回一個'option'標記,其值為空。 所以我嘗試了另一種方法:

$item_options = $dom->getElementById('attribute141');
print(sizeof($item_options->childNodes)); // Prints "1"
foreach ($item_options->childNodes as $child) {
    $sizes_list[] = $child->getAttribute('value');
}
$cloth_item->setSizes($sizes_list);

似乎又找到了一個空值...為什么我無法訪問其余選項?

從URL解析HTML頁面時,絕對不要引用瀏覽器頁面檢查器,因為DOM / js解析后檢查器會顯示源。 您需要參考“查看頁面源代碼”瀏覽器命令,或者-更好-在php中做到這一點:

$html = file_get_contents( 'http://www.example.com/your/url.html' );
file_put_contents( '/Path/Local/Download/Page.html', $html );

然后,使用文本編輯器打開下載的文件,以查看正在使用的真實HTML

在您的特定情況下,您只能檢索一個<option>因為...加載的頁面中只有一個<option>

<div class="input-box">
    <select name="super_attribute[141]" id="attribute141" class="required-entry super-attribute-select">
        <option>בחר אפשרות...</option>
    </select>
</div>

其他選項由JavaScript加載。 它們的值以JSON格式存儲在同一頁面的腳本中。 沒有干凈的方法來檢索它。 您可以使用PhantomJS ,但是-如您在此處或在其他Stack Overflow問題上所看到的-使用php並不容易。

可能是這樣一種骯臟的方式:查看HTML源代碼,您可以看到您的數據采用以下格式:

<script type="text/javascript">
    var spConfig = new Product.Config({ (...) });
</script>

因此,您可以檢索所有<script>節點並搜索new Product.Config值。

使用純DOM:

$nodes = $dom->getElementsByTagName('script');  // Result: 70 nodes

使用DOMXPath

$xpath = new DOMXPath( $dom );
$nodes = $xpath->query('//script[@type="text/javascript"]');  // Result: 58 nodes

然后,遍歷所有節點,查找正則表達式模式並對其進行解碼:

foreach( $nodes as $node )
{
    if( preg_match( '~new Product\.Config\((.+?)\);~', $node->nodeValue, $matches ) )
    {
        $data = json_decode( $matches[1] );
        break;
    }
}

此時,在$data您具有以下解碼的JSON:

stdClass Object
(
    [attributes] => stdClass Object
        (
            [141] => stdClass Object
                (
                    [id] => 141
                    [code] => size
                    [label] => מידה
                    [options] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 36
                                    [label] => 36
                                    [price] => 0
                                    [oldPrice] => 0
                                    [products] => Array
                                        (
                                            [0] => 93548
                                        )
                                )
                            (...)
                        )
                )
        )
)

因此,要訪問第一個<option> id,可以使用以下命令:

echo $data->attributes->{141}->options[0]->id; // Output: 36
#                       ↑ note curly brackets to access to a not-valid property key

等等:

echo $data->attributes->{141}->options[1]->id;    // Output: 38
echo $data->attributes->{141}->options[1]->label; // Output: 38
echo $data->attributes->{141}->options[1]->price; // Output: 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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