Я пытаюсь разобрать 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
];
}
Любая идея?






Проверить возвращаемое значение -
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
...
Я обновил пример кода с помощью тестового запуска, используя эту страницу в качестве URL-адреса с образцом вывода.
Большое спасибо, ваши ответы помогли, но может ли DOMDocument получать элементы на основе селектора css, например JQuery? потому что я хочу настроить таргетинг на href на основе определенного класса.
Вам придется использовать XPath, может помочь stackoverflow.com/questions/8680721/….
Я следил за вашим решением
$doc->loadHTML($cc['body']);, но он по-прежнему возвращает его в строке var_dump или запрашивает его так:if (is_string($cc)) {echo "yes";}, все это указывает на то, что это строка, а не простой HTML.