2014-09-20 4 views
0
<?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-адресами он работает нормально. В чем может быть проблема?Не удается открыть удаленный файл для запуска Xpath на нем

ответ

0

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

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

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

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

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

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

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

+0

@derp: Спасибо, я буду иметь, чтобы смотреть на это ... это странно. Он находится в пространстве имен XHTML, но на первый взгляд кажется, что он не выполняет рекомендацию по пространству имен XML (http://www.w3.org/TR/REC-xml-names/). – LarsH

+0

@derp Как HTML5 выходит из SGML? Я думал, что HTML - это приложение SGML. – LarsH

2

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

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

$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 
Смежные вопросы