Извлечение значений узла с помощью XPath

Существует раздел amazon.com, из которого я хочу извлечь данные (только значение узла, а не ссылка) для каждого элемента.

Значение, которое я ищу, находится внутри и <span class="narrowValue">

 <ul data-typeid="n" id="ref_1000"> <li style="margin-left: -18px"> <a href="/s/ref=sr_ex_n_0?rh=i%3Aaps%2Ck%3Ahow+to+grow+tomatoes&amp;sort=salesrank&amp;keywords=how+to+grow+tomatoes&amp;ie=UTF8&amp;qid=1327603358"> <span class="expand">Any Department</span> </a> </li> <li style="margin-left: 8px"> <strong>Books</strong> </li> <li style="margin-left: 6px"> <a href="/s/ref=sr_nr_n_0?rh=k%3Ahow+to+grow+tomatoes%2Cn%3A283155%2Cp_n_feature_browse-bin%3A618073011%2Cn%3A%211000%2Cn%3A48&amp;bbn=1000&amp;sort=salesrank&amp;keywords=how+to+grow+tomatoes&amp;ie=UTF8&amp;qid=1327603358&amp;rnid=1000"> <span class="refinementLink">Crafts, Hobbies & Home</span><span class="narrowValue">(19)</span> </a> </li> <li style="margin-left: 6px"> <a href="/s/ref=sr_nr_n_1?rh=k%3Ahow+to+grow+tomatoes%2Cn%3A283155%2Cp_n_feature_browse-bin%3A618073011%2Cn%3A%211000%2Cn%3A10&amp;bbn=1000&amp;sort=salesrank&amp;keywords=how+to+grow+tomatoes&amp;ie=UTF8&amp;qid=1327603358&amp;rnid=1000"> <span class="refinementLink">Health, Fitness & Dieting</span><span class="narrowValue">(3)</span> </a> </li> <li style="margin-left: 6px"> <a href="/s/ref=sr_nr_n_2?rh=k%3Ahow+to+grow+tomatoes%2Cn%3A283155%2Cp_n_feature_browse-bin%3A618073011%2Cn%3A%211000%2Cn%3A6&amp;bbn=1000&amp;sort=salesrank&amp;keywords=how+to+grow+tomatoes&amp;ie=UTF8&amp;qid=1327603358&amp;rnid=1000"> <span class="refinementLink">Cookbooks, Food & Wine</span><span class="narrowValue">(2)</span> </a> </li> </ul> 

Как я могу это сделать с XPath?

код указан по ссылке amazon kindle search

в настоящее время я пытаюсь

 $rank=array(); $words = $xpath->query('//ul[@id="ref_1000"]/li/a/span[@class="refinementLink"]'); foreach ($words as $word) { $rank[]=(trim($word->nodeValue)); } var_dump($rank); 

Следующее выражение должно работать:

 //*[@id='ref_1000']/li/a/span[@class='narrowValue'] 

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

Имейте в виду, что ваш парсер HTML может генерировать другое дерево результатов, чем тот, который был создан Firebug (где я тестировал). Вот еще более гибкое решение:

 //*[@id='ref_1000']//span[@class='narrowValue'] 

Гибкость связана с потенциальными затратами на производительность (и точность), но часто это единственный выбор при работе с супом для тегов.

Если вам нужно присвоить имена категорий:

 // Suppress invalid markup warnings libxml_use_internal_errors(true); // Create SimpleXML object $doc = new DOMDocument(); $doc->strictErrorChecking = false; $doc->loadHTML($html); // $html - string fetched by CURL $xml = simplexml_import_dom($doc); // Find a category nodes $categories = $xml->xpath("//span[@class='refinementLink']"); 

РЕДАКТИРОВАТЬ. Использование DOMDocument

 $doc = new DOMDocument(); $doc->strictErrorChecking = false; $doc->loadHTML($html); $xpath = new DOMXPath($doc); // Select the parent node $categories = $xpath->query("//span[@class='refinementLink']/.."); foreach ($categories as $category) { echo '<pre>'; echo $category->childNodes->item(1)->firstChild->nodeValue; echo $category->childNodes->item(2)->firstChild->nodeValue; echo '</pre>'; // Crafts, Hobbies & Home (19) } 

Я настоятельно рекомендую вам проверить библиотеку phpQuery . Это, по сути, механизм выбора jQuery для PHP, поэтому, чтобы получить текст, который вы хотите, вы можете сделать что-то вроде:

 foreach (pq('span.refinementLink') as $p) { print $p->text() . "\n"; } 

Это должно вывести что-то вроде:

 Crafts, Hobbies & Home Health, Fitness & Dieting Cookbooks, Food & Wine 

Это, безусловно, самый простой скриншот экрана, DOM-анализ, который я знаю для PHP.