Пример с DOMDocument
запрашивая значение атрибута класса дословно (с пробелами вокруг):
// configuration
libxml_use_internal_errors(true);
// input
$url = 'http://www.amazon.com/Likeable-Social-Media-Irresistible-ebook/dp/B00511ONPG/ref=tmm_kin_title_0?ie=UTF8&qid=1367741120&sr=8-1';
// processing
$doc = new DOMDocument();
$doc->loadHTMLFile($url);
$xpath = new DOMXPath($doc);
$prices = $xpath->query("//*[@class=' price ']/text()");
// output
foreach($prices as $index => $price) {
printf("%d: %s\n", $index, trim($price->textContent));
}
Выход:
0: $14.81
1: $18.38
2: $11.58
3: --
4:
5:
Обратите внимание, что t URL, который вы указали, содержит недопустимый HTML. Поэтому анализатор simpledom может давать разные результаты (или вообще не работает) с предоставленными данными. Это справедливо и для объекта DOMDocument
, который я здесь использую, однако он построен поверх довольно стабильной библиотеки libxml (не только в мире PHP, но и во многих других мирах), а также имеет свойство recovery
что позволяет осуществлять дальнейший контроль.
Попробуйте '$ html1-> find ('. Price')' вместо этого. Затем извлеките текстовое значение из результата. Если это не поможет, возьмите библиотеку HTML, совместимую с DOM Level4, которая предлагает ['DOMDocument :: getElementsByClassName'] (http://www.w3.org/TR/domcore/#dom-document-getelementsbyclassname). – hakre
это просто захватывает класс = «цена», а не тот, у которого есть 2 пробела. – user2349095
Уверен, потому что по определению атрибут класса представляет собой список классов классов, разделенных пробелами. Это объясняется в документации HTML и CSS. Обычно вы хотите использовать это при очистке HTML, поэтому я не знаю, почему это проблема для вас. Возможно, вы захотите расширить условие. В противном случае, если вы хотите отфильтровать точное строковое значение аргумента, найдите все теги, у которых есть атрибут класса, а затем отфильтруйте это строковое значение. – hakre