Извлечение значений узлов с использованием XPath - PullRequest
1 голос
/ 27 января 2012

Существует раздел 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

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

$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);

Ответы [ 3 ]

2 голосов
/ 27 января 2012

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

// 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']");


EDIT. Использование DOMDocument

<code>$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 '
'; // Рукоделие, хобби и дом (19) }
2 голосов
/ 27 января 2012

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

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

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

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

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

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

0 голосов
/ 27 января 2012

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

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

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

Crafts, Hobbies & Home
Health, Fitness & Dieting
Cookbooks, Food & Wine
* 1008безусловно, самый простой анализ экрана, анализ DOM для PHP.
...