Как спарсить только определённый тег (с помощью simple html dom)?

375
18 апреля 2017, 10:23

Приветствую. Использую Simple HTML DOM для парсинга товаров интернет-магазина. Параметр "вес товара" лежит в этом куске:

            <div id="AddnInfo">
            <p>
                <p><label>&ldquo;R&rdquo;Web#:</label> <span class="value">399014</span></p>
                <p><label>SKU:</label> <span class="value">0279D033</span></p> 
                <p><label>Manufacturer #:</label> B5529</p>
                <p><label>Product Weight:</label>1.5&nbsp;pounds</p>
                <p><label>Product Dimensions (in inches):</label>8.5 x 7.9 x 2.3</p>
            </p>
        </div>  

Причём, как до нужной цифры, так и после неё может быть совершенно любое количество < p > ... < / p >, т. е. её место в вышеуказанном списке непостоянно.
Вопрос - по какому принципу можно выдернуть из этого кода Product Weight?

Answer 1

Вас следует найти исходный родительской блок #AddnInfo и список всех дочерних элементов label. Далее сравнить содержимое текста этих меток на предмет соответствия Product weight:. Для найденной нужной метки взять родительский элемент и получить его текстовый контент:

define("PRODUCT_WEIGHT", 'Product Weight:');
$html = str_get_html($txt);
$labels = $html->find("#AddnInfo label");
foreach($labels as $l){
    if($l->innertext === PRODUCT_WEIGHT){
        $weight = (string)$l->parent()->find('text', 1)
        break;
    }
}
print_r([$weight, html_entity_decode($weight)]);

$weight будет содержать значение 1.5&nbsp;pounds. С помощью html_entity_decode можно преобразовать &nbsp, но преобразуется оно не в обычный ASCII пробел (32), а в 160й (0xA0), и поэтому не обрезается с помощью trim().

Если вам далее потребуется вытащить только численное значение, то вы можете либо просто удалить подстроку &nbsp; pounds, либо, если допустить, что там не всегда pounds и т.п. воспользоваться соответствующим регулярным выражением:

preg_match("/\d+(?:\.\d+)?/", $weight, $matches);

тогда в $matches[0] окажется зачение 1.5

READ ALSO
Php скрипт отправки сообщения mail()

Php скрипт отправки сообщения mail()

Добрый день, можете помочь объяснить, почему после отправки сообщения, сообщение приходит со сломанной кириллицей? Правильно ли написаны...

276
вставка массива в массив [требует правки]

вставка массива в массив [требует правки]

Нужно вставить в вектор векторов еще один вектор векторов после k-той строки, но компилятор выдаёт ошибкуВот код: https://hastebin

269
QTimer не срабатывает

QTimer не срабатывает

Доброго времени суток! Написал небольшой класс и в нем QTimer, но при вызове start() приложение входит в вечный циклС моей точки зрения, все норм,...

221
C++ показать вторую букву из слова

C++ показать вторую букву из слова

ПриветНужна помощь с выводом определенных букв из слова

276