Простой HTML DOM, возвращающий NULL

Я собираю данные с веб-сайта с помощью парсера Simple HTML DOM (http://simplehtmldom.sourceforge.net/ )

HTML-код:

<tr class="productListing-odd">
    <td align="right" class="productListing-data">&nbsp;0&nbsp;</td>
    <td class="productListing-data">&nbsp;<a href="http://www.spellvault.net/p46563/Liliana-of-the-Veil/product_info.html" onmouseout="hd()" onmouseover="sd('images/101257121.jpg')">Liliana of the Veil</a>&nbsp;<br>    </td>
    <td align="center" class="productListing-data">&nbsp;Black&nbsp;</td>
    <td align="center" class="productListing-data">&nbsp;Mythic&nbsp;</td>
    <td align="center" class="productListing-data">&nbsp;Innistrad&nbsp;</td>
    <td align="right" class="productListing-data">€42,50&nbsp;</td>
    <td align="center" class="productListing-data"><input type="text" name="var[46563]" value="" size="4">&nbsp;    <span class="nowrap"><span class="template-button-left">&nbsp;</span><span class="template-button-middle"><input class="submitButton" type="submit" value="Bestel"></span><span class="template-button-right">&nbsp;</span></span>&nbsp;</td>
  </tr>

И пхп:

include_once('simple_html_dom.php');

$html = file_get_html('-the url of the search query on the website-');

$array = array();
foreach($html->find('.productListing-odd, .productListing-even') as $element) {
    $row = array(
        'name' => strip_tags($element->childNodes(1)->innertext),
        'set' => strip_tags($element->childNodes(4)->innertext),
        'price' => strip_tags($element->childNodes(5)->innertext),
        'stock' => strip_tags($element->childNodes(0)->innertext)
    );
    array_push($array, $row);
}
echo json_encode($array);

По какой-то причине значение «цена» продолжает возвращать NULL. Все остальные значения собираются правильно. Я не могу понять, почему это происходит, поскольку все элементы имеют одинаковую структуру.

Заранее спасибо!


person Leon    schedule 31.01.2014    source источник
comment
Есть ли причина, по которой вы используете strip_tags($element->childNodes(1)->innertext) вместо $element->childNodes(1)->plaintext?   -  person Enissay    schedule 01.02.2014
comment
Или еще лучше: $element->find('td[2] a', 0)->text()   -  person pguardiario    schedule 01.02.2014
comment
Причины здесь в том, что я совершенно новичок в этом. Спасибо за совет!   -  person Leon    schedule 02.02.2014


Ответы (1)


Скорее всего, этот HTML-код, который вы проанализировали, имеет кодировку, отличную от юникода. И это проблема, так как json_encode() работает только с кодировкой UTF-8. Почти все данные, которые вы проанализировали, имеют символы ASCII, поэтому это не приводит к каким-либо проблемам. Но данные о цене (6-й столбец) содержат не-ASCII-символ '€', на котором json_encode() не работает (и возвращает ноль).

person hindmost    schedule 31.01.2014