Существует раздел 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&sort=salesrank&keywords=how+to+grow+tomatoes&ie=UTF8&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&bbn=1000&sort=salesrank&keywords=how+to+grow+tomatoes&ie=UTF8&qid=1327603358&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&bbn=1000&sort=salesrank&keywords=how+to+grow+tomatoes&ie=UTF8&qid=1327603358&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&bbn=1000&sort=salesrank&keywords=how+to+grow+tomatoes&ie=UTF8&qid=1327603358&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']");
$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.