Почему я не возвращаю сюда изображения? - PullRequest
3 голосов
/ 19 апреля 2011
$url = 'http://www.w3schools.com/js/js_loop_for.asp';
$html = @file_get_contents($url);

$doc = new DOMDocument();
@$doc->loadHTML($html);
$xml = @simplexml_import_dom($doc);
$images = $xml->xpath('//img');

var_dump($images);
die();

Вывод:

array(0) { }

Однако, на странице источника я вижу это:

<img border="0" width="336" height="69" src="/images/w3schoolslogo.gif" alt="W3Schools.com" style="margin-top:5px;" />

Редактировать: Похоже, содержание $html останавливается на теге <body> для этой страницы. Есть идеи почему?

Ответы [ 3 ]

9 голосов
/ 27 апреля 2011

Похоже, содержание $ html останавливается на теге для этой страницы.Любая идея, почему?

Да, вы должны предоставить этой странице действительный пользовательский агент.

$url = 'http://www.w3schools.com/js/js_loop_for.asp';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
curl_exec($ch);

выводит все в конец </html>, включая запрошенный <img border="0" width="336" height="69" src="/images/w3schoolslogo.gif" alt="W3Schools.com" style="margin-top:5px;" />

Когда простой wget или curl без агента пользователя возвращается только до тега <body>.

$url = 'http://www.w3schools.com/js/js_loop_for.asp';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);

$doc = new DOMDocument();
$doc->loadHTML($html);
$xml = simplexml_import_dom($doc);
$images = $xml->xpath('//img');

var_dump($images);
die();

РЕДАКТИРОВАТЬ: В моем первом посте говорилось, чтовсе еще была проблема с xpath ... Я просто не выполнял должной осмотрительности, и обновленный код выше прекрасно работает.Я забыл заставить curl выводить в строку, а не печатать на экран (как это делается по умолчанию).

0 голосов
/ 26 апреля 2011

Тег IMG генерируется JavaScript. Если бы вы загрузили эту страницу через wget, вы бы поняли, что в HTML нет тега IMG.

Обновление # 1

Я полагаю, это из-за строки пользовательского агента. Если я поставлю «Mozilla / 5.0 (X11; Linux i686 на x86_64; rv: 2.0) Gecko / 20100101 Firefox / 4.0» в качестве идентификатора агента пользователя, я получу страницу целиком.

0 голосов
/ 19 апреля 2011

Зачем вносить симплекс в смесь? Вы уже загружаете HTML-код из w3fools в класс DOM, в котором уже есть превосходный механизм запросов XPath.

[...snip...]
$doc->loadHTML($html);
$xpath = new DOMXPath($doc)
$images = $xpath->xpath('//img');
[...snip...]
...