Получение значения div (контент/текст) с использованием XPath

У меня есть следующая структура html:

<li id="REQUIRED_ITEM_1" class="listing-post">

    <a class="listing-thumb" href="blah" title="blah" data-palette-listing-image="">

        <img src="REQUIRED_ITEM_2" width="75" height="75" alt="blah"> </a>

    <div class="listing-detail ">

        <div class="listing-title">

            <div class="listing-icon hidden"></div>

              <a href="REQUIRED_ITEM_3" class="title" title="REQUIRED_ITEM_4">blah</a>

              <div class="listing-maker">

                <span class="name wrap"><a href="REQUIRED_ITEM_5">blah</a></span>

              </div>

        </div>

        <div class="listing-date">
            REQUIRED_ITEM_6
        </div>

        <div class="listing-price">
            Sold
        </div>

    </div>
    </li>

На одной странице несколько десятков таких <li>, все с разными id и контентом. Контент, который мне нужен, помечен как REQUIRED_ITEM_1 - REQUIRED_ITEM_6.

Я собираю данные из этих <li> с помощью Xpath.

Вот код, который я использую:

    foreach($xpath->query("//li[@class='listing-post']") as $link) {

    $REQUIRED_ITEM_1 = $link->getAttribute('id');
    $REQUIRED_ITEM_2 = $xpath->query(".//img", $link)->item(0)->getAttribute('src');
    $REQUIRED_ITEM_3 = $xpath->query(".//a", $link)->item(1)->getAttribute('href');
    $REQUIRED_ITEM_4 = $xpath->query(".//a", $link)->item(1)->getAttribute('title');
    $REQUIRED_ITEM_5 = $xpath->query(".//a", $link)->item(2)->getAttribute('href');

    $REQUIRED_ITEM_6 = $xpath->query("./div/text", $link)->item(4);
}

Он работает так, как предполагалось, для первых 5 REQUIRED_ITEM, однако кажется, что код для получения текста, содержащегося в listing-date div (REQUIRED_ITEM_6), неверен.

Кроме того, это лучший способ проанализировать мой html и собрать данные, или есть лучший подход?


person Acidon    schedule 22.10.2015    source источник


Ответы (1)


Вот xPath для получения REQUIRED_ITEM_6

//li[@class='listing-post']//div[@class='listing-date']/text()

Это было бы немного быстрее (но первая версия может быть более безопасной, так как она меньше зависит от структуры XML).

//li[@class='listing-post']/div/div[@class='listing-date']/text()

Таким образом, ваш код должен выглядеть примерно так (но вам может потребоваться немного изменить его с помощью вашего php, не знаю, почему вы использовали item (4)).

$REQUIRED_ITEM_6 = $xpath->query(".//div[@class='listing-date']/text()", $link)->item(0)->textContent;
person Dmytro Pastovenskyi    schedule 22.10.2015
comment
каким будет точный код запроса? (начиная с $REQUIRED_ITEM_6 = $xpath->query) - person Acidon; 22.10.2015
comment
Я обновил ответ, указав точную строку кода, которая вам нужна. - person Dmytro Pastovenskyi; 22.10.2015
comment
Только что попробовал, и получение объекта класса DOMNodeList не могло быть преобразовано в строковую ошибку в строке с кодом - person Acidon; 22.10.2015
comment
@Acidon: попробуйте добавить -›item(0) (я снова обновил сообщение), просто проверьте объект DOMNodeList, данные есть. - person Dmytro Pastovenskyi; 22.10.2015
comment
теперь получение объекта класса DOMText не может быть преобразовано в строку после добавления -›item(0) - person Acidon; 22.10.2015
comment
БИНГО! Ты человек! Это -›nodeValue — именно то, что я искал целый день! Текстовый контент тоже работает - person Acidon; 22.10.2015