2011-12-19 2 views
1

У меня есть следующий html, и я использую класс DomDocument php, чтобы получить элемент с id 'nextPageBtn' рядом с тегом скрипта. проблема в том, что мой запрос ничего не возвращает (как будто нет элемента с указанным id). heres html, который я разбираю.получить элемент, используя php DomDocument

<body> 
    <div style='float:left'><img src='../../../../includes/ph1.jpg'></div> 

    <label style='width: 476px; height: 40px; position: absolute;top:100px; left: 40px; z-index: 2; background-color: rgb(255, 255, 255);; background-color: transparent' > 
    <font size="4">1a. Nice to meet you!</font> 
    </label> 
    <img src='ENG_L1_C1_P0_1.jpg' style='width: 700px; height: 540px; position: absolute;top:140px; left: 40px; z-index: 1;' /> 

    <script type='text/javascript'> 


    swfobject.registerObject('FlashID'); 
    </script> 

    <input type="image" id="nextPageBtn" src="../../../../includes/ph4.gif" style="position: absolute; top: 40px; left: 795px; "> 

    </body> 

и heres код php для его анализа.

$doc->loadHTMLFile($path); 

    $doc->encoding='UTF-8'; 
    $x = new DOMXPath($doc); 
$nextPage=$x->query("//*[@id='nextPageBtn']")->item(0); 
if($nextPage) 
    { 

    echo 'found it..'; 
} 

Я думаю, что линия «swfobject.registerObject (» FlashID «)» генерирует какую-то ошибку, которая уклоняется элемент можно найти?

+0

Ваше выражение xpath выглядит действительным с первого взгляда. - И остальная часть вашего кода. Невозможно воспроизвести: http://codepad.viper-7.com/RUNGOd - возможно, вы смотрите не на то место. '$ doc-> encoding = 'UTF-8';' выглядит излишним для меня. – hakre

+0

Если вы можете редактировать разметку обрабатываемого файла, я бы предложил просто дать идентификатор элементу, который вы хотите захватить, а затем getElementById(). – GordonM

+0

Что @GordonM говорит: если XHTML имеет [DTD] (http://en.wikipedia.org/wiki/Document_Type_Definition), который указывает атрибут [ID] (http://www.theukwebdesigncompany.com/articles/xml -id-idref-dtd.php), 'getElementById' работает. – hakre

ответ

1

Как написано в комментарии, ваш код работает безупречно. Демонстрация: http://codepad.viper-7.com/RUNGOd

Что вы считаете источником проблемы:

Я думаю, что линия «swfobject.registerObject (» FlashID «)» генерирует какую-то ошибку, которая уклоняется элемент можно найти?

Едва ли может быть один, как DOMDocument::loadHTMLFile должны иметь дело со всеми тегами (в противном случае вы бы получили ошибки/предупреждений в загрузке документа. После загрузки была сделана, DOMDocument нормализовалась доступны данные, так что не такие вопросы (если в libxml нет базовой библиотеки, но вряд ли стоит такая общая вещь).

Итак, какие здесь варианты? Возможно, HTML - это не HTML, о котором вы думаете. если загрузка HTML не выполняется в вашем случае. Проверьте наличие ошибок при загрузке:

error_reporting(~0); ini_set('display_errors', 1); 

проверить также, что HTML является HTML вы думаете, после того, как загрузка:

$doc->loadHTMLFile($path); 
echo $doc->saveHTML(); 

, который будет выводить «источник».

Также проверить Libxml версия:

printf("LIBXML version: %s\n", LIBXML_DOTTED_VERSION); 

Libxml является основной библиотекой РНР DOMDocument основана. В зависимости от версии могут быть ошибки, и не все функции работают. Например, функция getElementById не работает с /loadHTML с версией 2.6.26, но с версией 2.7.7 (выражение XPath, которое вы используете, не зависит от этих двух версий).

Если вы столкнулись с проблемой кодирования здесь (исходный файл имеет другую кодировку, чем ожидалось), с информацией, которую вы предоставили, сложнее сказать. Внутренне DOMDocument «s кодировкой по умолчанию является UTF-8 в PHP, поэтому установка:

$doc->encoding='UTF-8'; 

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

+0

Спасибо, hakre ... выяснили, что проблема была в utf-8 ... удалили это n все в порядке! – samach

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