Доступ к дочерним элементам div с использованием DOMDocument и XPath - PullRequest
1 голос
/ 18 сентября 2010

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

Данные, к которым я пытаюсь получить доступ, структурированы следующим образом:

<tr>
    <td>
        <div class="wrapper">
            <div class="randomDiv">
                <div class="divContent">
                    <div class="event">asd</div>
                    <div class="date">asd</div>
                    <div class="venue">asd</div>
                    <div class="state">asd</div>
                </div>
            </div>
        </div>
    </td>
</tr>

Я пытаюсь собрать все эти данные (поскольку на данной странице около 20 строк).

Используя следующий код, мне удалось собрать нужные мне данные:

$remote = file_get_contents("linktoURL");

$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$file = @$doc->loadHTML($remote);
$rows = $doc->getElementsByTagName('tr');
$xp = new DOMXpath($doc);

//initialize variables
$rows = array();

foreach($xp->query('//*[contains(@class, \'wrapper\')]', $doc) as $found) {
    echo "<pre>";
    print_r($found->nodeValue);
}

Теперь мой вопрос: как мне сохранить все эти данные в ассоциативном массиве, как показано ниже:

Array (
    [0] => Array
        (
            [Event] => Name
            [Date] => 12/12/12
            [Venue] => NameOfPlace
            [state] => state
        )

    [1] => Array
        (
            [Event] => Name
            [Date] => 12/12/12
            [Venue] => NameOfPlace
            [state] => state
        )

    [2] => Array
        (
            [Event] => Name
            [Date] => 12/12/12
            [Venue] => NameOfPlace
            [state] => state
        )

)

Сейчас единственное решение, которое приходит на ум, - это вызвать запрос xpath для каждого имени класса //*[contains(@class, \'className\')] в цикле foreach.

Есть ли более идиоматический способ через DOMDocument и XPath, в котором я могу создать ассоциативный массив вышеуказанных данных?

редактирование:

Я не ограничен использованием DOMDocument и XPath, если есть другие решения, которые могут быть проще, пожалуйста, опубликуйте их.

1 Ответ

0 голосов
/ 21 сентября 2010

Вы можете импортировать некоторые функции в DOMXPath, зарегистрировав функции PHP, но, AFAIK, вы ограничены в возврате скаляров или наборов узлов.

Вы можете преобразовать его с помощью простой таблицы стилей, используя XSLTProcessor::transformToDoc(), возможно, экспортировав еев SimpleXML для более легкого доступа.Вопрос в том, быстрее ли это, чем искать каждый класс вручную.

Конечно, вы можете сократить использование XPath с помощью //div[contains(@class, 'event') or contains(@class, 'date')] и т. Д.

...