CURLOPT_RETURNTRANSFER возвращает HTML в строке

Я пытаюсь разобрать HTML с помощью CURL DOMDocument или Xpath, но CURLOPT_RETURNTRANSFER всегда возвращает HTML-адрес URL в строке, что делает его недопустимым для анализа HTML

Возвращенный вывод:

string(102736) "<!DOCTYPE html>


    <html itemscope itemtype = "http://schema.org/QAPage" class = "html__responsive">

    <head>

        <title>html - PHP outputting text WITHOUT echo/print? - Stack Overflow</title>
        <link rel = "shortcut icon" href = "https://cdn.sstatic.net/Sites/stackoverflow/img/favicon.ico?v=4f32ecc8f43d">
        <link rel = "apple-touch-icon image_src" href = "https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon.png?v=c78bd457575a">
        <link rel = "search" type = "application/opensearchdescription+xml" title = "Stack Overflow" href = "/opensearch.xml">
        <meta name = "viewport" content = "width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0">"

PHP snipe увидеть результат

$cc = $http->get($url);
var_dump($cc);

Используемая библиотека CURL:https://github.com/seikan/HTTP/blob/master/class.HTTP.php

Когда я удаляю CURLOPT_RETURNTRANSFER, я вижу HTML без строки (102736), но он отображает URL-адрес, даже если я не запрашивал (ссылка: curl_exec печатает результаты, когда я не хочу)

Вот фрагмент кода PHP, который я использовал для синтаксического анализа html:

  $cc = $http->get($url);
  $doc = new \DOMDocument();
  $doc->loadHTML($cc);

  // all links in document
  $links = [];
  $arr = $doc->getElementsByTagName("a"); // DOMNodeList Object
  foreach($arr as $item) { // DOMElement Object
    $href =  $item->getAttribute("href");
    $text = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
    $links[] = [
      'href' => $href,
      'text' => $text
    ];
  }

Любая идея?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проверить возвращаемое значение -

print_r($cc);

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

return [
    'header' => $headers,
    'body'   => substr($response, $size),
];

Поэтому вам нужно будет изменить линию нагрузки на ...

$doc->loadHTML($cc['body']);

Обновлять:

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

$cc = $http->get("https://stackoverflow.com/questions/51319473/curlopt-returntransfer-returns-html-in-string/51319585?noredirect=1#comment89619183_51319585");
$doc = new \DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($cc['body']);

// all links in document
$links = [];
$arr = $doc->getElementsByTagName("a"); // DOMNodeList Object
foreach($arr as $item) { // DOMElement Object
    $href =  $item->getAttribute("href");
    $text = trim(preg_replace("/[\r\n]+/", " ", $item->nodeValue));
    $links[] = [
        'href' => $href,
        'text' => $text
    ];
}

print_r($links);

Выходы ...

Array
(
    [0] => Array
        (
            [href] => #
            [text] => 
        )

    [1] => Array
        (
            [href] => https://stackoverflow.com
            [text] => Stack Overflow
        )

    [2] => Array
        (
            [href] => #
            [text] => 
        )

    [3] => Array
        (
            [href] => https://stackexchange.com/users/?tab=inbox
...

Я следил за вашим решением $doc->loadHTML($cc['body']);, но он по-прежнему возвращает его в строке var_dump или запрашивает его так: if (is_string($cc)) {echo "yes";}, все это указывает на то, что это строка, а не простой HTML.

user9774304 13.07.2018 11:27

Я обновил пример кода с помощью тестового запуска, используя эту страницу в качестве URL-адреса с образцом вывода.

Nigel Ren 13.07.2018 16:12

Большое спасибо, ваши ответы помогли, но может ли DOMDocument получать элементы на основе селектора css, например JQuery? потому что я хочу настроить таргетинг на href на основе определенного класса.

user9774304 14.07.2018 10:45

Вам придется использовать XPath, может помочь stackoverflow.com/questions/8680721/….

Nigel Ren 14.07.2018 10:51

Другие вопросы по теме