2013-05-05 3 views
0

следующий класс, я хотел бы сослаться, используя простой HTML DOMпростой HTML DOM пространство в классе

но есть 2 класса один

является

class="price" 

другой, кажется, class=" price"

, используя этот код, как представляется, не находит его

foreach ($html1->find('[class= price ]/text()',0) as $price_data2) 

источник для данной страницы здесь

http://www.amazon.com/Likeable-Social-Media-Irresistible-ebook/dp/B00511ONPG/ref=tmm_kin_title_0?ie=UTF8&qid=1367741120&sr=8-1

+0

Попробуйте '$ html1-> find ('. Price')' вместо этого. Затем извлеките текстовое значение из результата. Если это не поможет, возьмите библиотеку HTML, совместимую с DOM Level4, которая предлагает ['DOMDocument :: getElementsByClassName'] (http://www.w3.org/TR/domcore/#dom-document-getelementsbyclassname). – hakre

+0

это просто захватывает класс = «цена», а не тот, у которого есть 2 пробела. – user2349095

+1

Уверен, потому что по определению атрибут класса представляет собой список классов классов, разделенных пробелами. Это объясняется в документации HTML и CSS. Обычно вы хотите использовать это при очистке HTML, поэтому я не знаю, почему это проблема для вас. Возможно, вы захотите расширить условие. В противном случае, если вы хотите отфильтровать точное строковое значение аргумента, найдите все теги, у которых есть атрибут класса, а затем отфильтруйте это строковое значение. – hakre

ответ

0

Пример с 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 что позволяет осуществлять дальнейший контроль.

+0

Выражение, которое я бы использовал, это '// * [содержит (concat ('', @class, ''), 'price')]' :) –

+0

@Jack: Да, если поиск будет для имени класса, здесь это значение атрибута дословно. – hakre

+0

Я не нашел ничего, чтобы поддержать это утверждение. –

0

Вы должны быть в состоянии использовать:

$html->find('*[class*=price]/text()') 

мне не нравится, что /text(), хотя, потому что это не реально CSS.

Также обратите внимание, что при итерации с foreach вам необходимо оставить ,0.

Смежные вопросы