2010-03-09 1 views
1

как же это не работает:Простой XML Загрузить файл не работает

$url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20xpath%3D%22%2F%2Fmeta%22%20and%20url%3D%22http://www.cnn.com%22&format=xml&diagnostics=false"; 

$xml = (simplexml_load_file($url)) 

я получаю несколько ошибок, рассказывающие мне запрос HTTP не удалось. В конце концов, я хочу, чтобы получить результаты из этого файла в массив, например

Описание = CNN.com предоставляет последние новости и т.д.

Ключевые слова = CNN, новости CNN, CNN.com, CNN TV и т.д.

Но этот начальный этап не работает. Любая помощь, пожалуйста?

EDIT Дополнительная информация:

Ошибки:

warning: simplexml_load_file(http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20xpath%3D%22//meta%22%20and%20url%3D%22http://www.cnn.com%22&format=xml&diagnostics=false) [function.simplexml-load-file]: failed to open stream: HTTP request failed! 
# warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20xpath%3D%22//meta%22%20and%20url%3D%22http://www.cnn.com%22&format=xml&diagnostics=false"
  • С моей phpinfo(): allow_url_fopen На На
  • PHP версии 5.2.11
  • Думаете, что это действует (http://query.yahooapis.com/v1/public/yql?q=select%20 *% 20%% 20html% 20 где% 20xpath% 3D % 22 // мета-% 22% 20and% 20url% 3D% 22http: //www.cnn.com%22 & = формат XML & диагностика = ложь)
+0

Какую версию libxml вы используете? ('phpinfo()' расскажет вам) – salathe

+0

Это 2.7.3 ...... –

+0

Добавьте 'error_reporting (-1);' в начале вашего скрипта, а также проверьте свой 'phpinfo()' и убедитесь, что «http» появляется в разделе «Зарегистрированные потоки PHP». –

ответ

3

(Примечание: Потенциально бесполезный ответ, как только реальный ответ был найден ...)


В то время как вы выяснить проблему XML (продолжать работать на нем!) Знаю, что вы также можете получить ответ YQL возвращается как JSON. Вот беглый пример:

$url = "http://query.yahooapis.com/v1/public/yql?q=select+%2A+" 
    . "from+html+where+xpath%3D%22%2F%2Fmeta%5B%40name%3D%27" 
    . "Keywords%27+or+%40name%3D%27Description%27%5D%22+and+" 
    . "url%3D%22http%3A%2F%2Fwww.cnn.com%22&format=json&diagnostics=false"; 

// Grab YQL response and parse JSON 
$json = file_get_contents($url); 
$result = json_decode($json, TRUE); 

// Loop over meta results looking for what we want 
$items = $result['query']['results']['meta']; 
$metas = array(); 
foreach ($items as $item) { 
    $metas[$item['name']] = $item['content']; 
} 
print_r($metas); 

Давая массив как (текст усечен для экрана):

Array 
(
    [Description] => CNN.com delivers the latest breaking news and … 
    [Keywords] => CNN, CNN news, CNN.com, CNN TV, news, news online … 
) 

Обратите внимание, что запрос YQL (try it in the console) немного отличается от вашей, чтобы сделать PHP проще ,

+0

Привет, это здорово, но я хочу, чтобы все метаданные, а не просто описание и ключевые слова. Сценарий должен быть применим к каждому сайт, поэтому он может анализировать каждый метатег, который на него накладывает сайт, а не только те, которые указаны в указанном lis т. Благодарю. –

+0

В этом случае измените запрос YQL как менее строгий (например, ваш оригинал). Обратите внимание, что не все метатеги будут содержать атрибуты 'name' и' content'. – salathe

+0

Я на самом деле просто попробовал свой код и, к сожалению, получаю похожие ошибки: 'file_get_contents (http://query.yahooapis.com/v1/public/yql?q=select+%2A+from+html+where+xpath%3D%22 % 2F% 2Fmeta ...) [function.file-get-contents]: не удалось открыть поток: HTTP-запрос не удался! 'И' warning: неверный аргумент, предоставленный foreach() 'Что может быть неправильным ???? –

0

Ну, XML является GETable. Что касается действительности, ему не хватает <?xml version="1.0"?>, но я думаю, что это не требуется.

<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="5" yahoo:created="2010-03-09T05:09:03Z" yahoo:lang="en-US" yahoo:updated="2010-03-09T05:09:03Z" yahoo:uri="http://query.yahooapis.com/v1/yql?q=select+*+from+html+where+xpath%3D%22%2F%2Fmeta%22+and+url%3D%22http%3A%2F%2Fwww.cnn.com%22"><results><meta content="HTML Tidy for Java (vers. 26 Sep 2004), see www.w3.org" name="generator"/><meta content="1800;url=?refresh=1" http-equiv="refresh"/><meta content="CNN.com delivers the latest breaking news and information on the latest top stories, weather, business, entertainment, politics, and more. For in-depth coverage, CNN.com provides special reports, video, audio, photo galleries, and interactive guides." name="Description"/><meta content="CNN, CNN news, CNN.com, CNN TV, news, news online, breaking news, U.S. news, world news, weather, business, CNN Money, sports, politics, law, technology, entertainment, education, travel, health, special reports, autos, developing story, news video, CNN Intl" name="Keywords"/><meta content="text/html; charset=iso-8859-1" http-equiv="content-type"/></results></query><!-- total: 250 --> 

Испытано на моем локальном сервере (PHP 5.3), без каких-либо ошибок, сообщенных. Я использовал ваш исходный код, и он работает. Вот print_r():


SimpleXMLElement Object 
(
    [results] => SimpleXMLElement Object 
     (
      [meta] => Array 
       (
        [0] => SimpleXMLElement Object 
         (
          [@attributes] => Array 
           (
            [content] => HTML Tidy for Java (vers. 26 Sep 2004), see www.w3.org 
            [name] => generator 
           ) 

         ) 

        [1] => SimpleXMLElement Object 
         (
          [@attributes] => Array 
           (
            [content] => 1800;url=?refresh=1 
            [http-equiv] => refresh 
           ) 

         ) 

        [2] => SimpleXMLElement Object 
         (
          [@attributes] => Array 
           (
            [content] => CNN.com delivers the latest breaking news and information on the latest top stories, weather, business, entertainment, politics, and more. For in-depth coverage, CNN.com provides special reports, video, audio, photo galleries, and interactive guides. 
            [name] => Description 
           ) 

         ) 

        [3] => SimpleXMLElement Object 
         (
          [@attributes] => Array 
           (
            [content] => CNN, CNN news, CNN.com, CNN TV, news, news online, breaking news, U.S. news, world news, weather, business, CNN Money, sports, politics, law, technology, entertainment, education, travel, health, special reports, autos, developing story, news video, CNN Intl 
            [name] => Keywords 
           ) 

         ) 

        [4] => SimpleXMLElement Object 
         (
          [@attributes] => Array 
           (
            [content] => text/html; charset=iso-8859-1 
            [http-equiv] => content-type 
           ) 

         ) 

       ) 

     ) 

) 

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

 Смежные вопросы

  • Нет связанных вопросов^_^