Не удается открыть удаленный файл для запуска Xpath на нем

<?php
$ch = curl_init("http://www.alibaba.com/showroom/black-and-white-wedding-dresses.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument;
$dom->strictErrorChecking = false;
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

$description = $xpath->query('//meta[@name="description"]/@content');
foreach ($description as $n) {
echo $n->nodeValue ;
}
?>

Ничего не возвращается .. С другими URL-адресами все работает нормально.
В чем может быть проблема?

0

Решение

Ваше выражение XPath в порядке. Сайт выполняет обнаружение агента пользователя и возвращает HTTP 302 ответ с местоположением, установленным на запрашивающий IP-адрес. Дамп это в файл, чтобы посмотреть.

Если вы добавите заголовок user-agent для имитации браузера на рабочем столе, запрос будет выполнен, и все будет работать как положено.

$ch = curl_init("http://www.alibaba.com/showroom/black-and-white-wedding-dresses.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1');
$html = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument;
$dom->strictErrorChecking = false;
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

$description = $xpath->query('//meta[@name="description"]/@content');
foreach ($description as $n) {
echo $n->nodeValue ;
}

Выход:

Black And White Wedding Dresses, You Can Buy Various High Quality Black And White Wedding Dresses Products from Global Black And White Wedding Dresses Suppliers and Black And White Wedding Dresses Manufacturers at Alibaba.com
2

Другие решения

Когда я проверяю эту страницу в DOM-инспекторе в Safari или Chrome, он говорит, что <meta> элементы (и все элементы) находятся в пространстве имен XHTML (пространство имен, URI которого http://www.w3.org/1999/xhtml). Я не знаю, почему они находятся в этом пространстве имен (необработанная разметка не указывает, что они находятся в этом пространстве имен, AFAICT), но это объяснило бы, почему ваше выражение XPath не выбирает их: оно запрашивает метаэлемент, который в нет Пространство имен.

Чтобы исправить это, используйте этот обходной путь:

$description = $xpath->query('//*[local-name() = 'meta' and
@name="description"]/@content');

Это позволит найти метаэлементы независимо от того, в каком пространстве имен они находятся.

Или, чтобы быть более эффективным, создайте преобразователь пространства имен с помощью xhtml префикс, связанный с URI пространства имен xhtml, а затем использовать этот преобразователь пространства имен с выражением

$description = $xpath->query('//xhtml:meta[@name="description"]/@content');

Но последний будет работать только для веб-страниц, где meta элементы находятся в пространстве имен XHTML.

0

По вопросам рекламы [email protected]