PHP Curl в PHP DOMDocument

Вот тот же код, который я извлек с веб-страницы...

<div class="user-details-narrow">
            <div class="profileheadtitle">
                <span class=" headline txtBlue size15">
                    Profession
                </span>
            </div>
            <div class="profileheadcontent-narrow">
                <span class="txtGrey size15">
                    administration
                </span>
            </div>
        </div>

<div class="user-details-narrow">
            <div class="profileheadtitle">
                <span class=" headline txtBlue size15">
                    Industry
                </span>
            </div>
            <div class="profileheadcontent-narrow">
                <span class="txtGrey size15">
                    banking
                </span>
            </div>
        </div>

Чего я хочу добиться, так это извлечь данные из этих DIV. Например...

Профессия = администратор Отрасль = банк

В настоящее время я загружаю веб-страницу с помощью Curl, затем удаляю теги html и использую сотни функций preg_match и if. Хотя решение работает очень хорошо, оно использует много процессора и оперативной памяти.

Вместо этого было предложено использовать DOMDocument, но я не могу заставить что-либо работать, в основном из-за отсутствия знаний.

Может ли кто-нибудь дать мне представление о том, как извлечь эти данные?


person Community    schedule 01.07.2015    source источник
comment
Вы должны демонстративно использовать документ DOM, так как затем вы можете вывести необходимые данные. У вас есть пример для обновления вашего сообщения со стороны PHP с вашим запросом CURL?   -  person Danny Broadbent    schedule 01.07.2015
comment
Спасибо за это, я попробую...   -  person    schedule 01.07.2015
comment
@AndyUK: проигнорируйте комментарий, там ошибка (метод DOMDocument::xpath не существует), я опубликовал ответ, показывающий правильный способ использования xpath для запроса DOM   -  person Elias Van Ootegem    schedule 01.07.2015
comment
возможный дубликат Как извлечь ключевое слово из веб-страницы с помощью PHP Дом   -  person chris85    schedule 02.07.2015


Ответы (1)


Публикация моего предыдущего комментария в качестве возможного ответа с некоторым объяснением того, почему я думаю, что именно так вы могли бы решить проблему:

$dom = new DOMDocument;
$dom->loadHTML($theHtmlString);
//get all profileheadtitle nodes
//they seem to contain the first bits of info you're after
$xpath = new DOMXpath($dom);
$titles = $xpath->query('//*[@class="profileheadtitle"]);
//let's iterate over them, using the `textContent` property to get the value
foreach ($titles as $div)
{
    //each node also has a second div right next to it
    //it's on the same level and we need its content, too
    //enter the DOMNode::$nextSibling property
    echo $div->textContent . ' ' . $div->nextSibling->textContent;
}

Работа выполнена. Проверьте документацию класса DOMNode для получения подробной информации, и, возможно, вы захотите прочитать класс DOMXpath тоже

Обратите внимание, что этот бит: $xpath->query('//*[@class="profileheadtitle"]); запрашивает DOM для всех узлов, имеющих класс profileheadtitle. Если вы хотите ограничить узлы только элементами <div>, которые имеют этот класс, вы можете написать это:

$xpath->query('//div[@class="profileheadtitle"]);

Также важно понимать, что хотя эта запись xpath и эффективна, она не будет работать, если некоторые (или все) элементы div имеют несколько классов. Он возвращает только те узлы, у которых есть один класс. Более академически правильно было бы написать так:

$xpath->query(
    '//div/[contains(concat(" ", normalize-space(@class), " "), concat(" ", "profileheadtitle", " "))]'
);

Это сможет обрабатывать такие узлы, как:

and

<div id="bar" class="foo profileheadtitle mark-red" style="border: 1px solid black;"></div>
person Elias Van Ootegem    schedule 01.07.2015
comment
Фантастика, я дам вам знать, как я получаю. Спасибо за это !! - person ; 01.07.2015
comment
Что касается проблемы класса, решение состоит в том, чтобы зарегистрировать функцию php (например, с именем hasClass) вместо использования равенства или contains: php.net/manual/en/domxpath.registerphpfunctions.php - person Casimir et Hippolyte; 01.07.2015
comment
Похоже, что это только список вопросов (профессия, отрасль), а не ответы. - person ; 01.07.2015