Как я могу сопоставить эти поля с помощью xpath? - PullRequest
0 голосов
/ 10 января 2012

Я пытаюсь отобразить список полей с веб-сайта, используя объект php DOMXPath, и я борюсь за него. Я пытался читать по абсолютной позиции, но она прерывается, когда поле отсутствует, и я подумал, что можно использовать имена полей, разделенные сильным тегом, чтобы найти правильные значения. Как я могу это сделать?

образец сайта:

<div class="container">
    <strong>field1: </strong>
    <a href="http://link/1">value1</a>
    <a href="http://link/2">value2</a>
    <br>
    <strong>field2:</strong>
    <a href="http://link/3">value3</a>
    <br>
    <strong>field3:</strong>
    <a href="http://link/4">value4</a>
</div>

Мне нужно что-то вроде:

array = {
    field1 => 
        array = {
            'value1',
            'value2'
        },
    field2 => 'value3',
    field3 => 'value4'
}

or

array = {
    field1 => 'value1 value2',
    field2 => 'value3',
    field3 => 'value4'
}

Рабочий пример был бы наиболее ценным, так как я только начинаю эту тему.

1 Ответ

1 голос
/ 10 января 2012
$dom = new DOMDocument();
$dom->loadHTML($str); // Or however you load your HTML

$xpath = new DOMXPath($dom);
$items = $xpath->query('//div[@class = "container"]/strong');


$arr = array();
for($i = 0; $i < $items->length; $i++)
{
    $node = $items->item($i);
    $name = trim($node->nodeValue, ': ');
    $node_items = array();
    while(true)
    {
        $node = $node->nextSibling->nextSibling;
        if($node == NULL || $node->nodeName != 'a')
        {
            break;
        }
        $node_items[] = $node->nodeValue;
    }

    $arr[$name] = count($node_items) == 1 ? $node_items[0] : $node_items;
}

Дает результат ($arr):

Array
(
    [field1] => Array
        (
            [0] => value1
            [1] => value2
        )

    [field2] => value3
    [field3] => value4
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...