Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Проблемы с DOMDocument
Форумы портала PHP.SU » » XML и его обработка » Проблемы с DOMDocument

Страниц (1): [1]
 

1. andreizanik - 03 Мая, 2013 - 16:49:06 - перейти к сообщению
Здравствуйте. Для обработки HTML документа использую DOMDocument.
Мне нужно достать все ссылки из документа в массив.
делаю так.
PHP:
скопировать код в буфер обмена
  1. $doc = new DOMDocument();
  2.         $doc->loadHTML($this->content);
  3.         $url[] = @$doc->getElementsByTagName('a')->item( 1 )->getAttribute('href');

$this->content - это строка которая содержит HTML.
Но получаю вот что
PHP:
скопировать код в буфер обмена
  1. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Misplaced DOCTYPE declaration in Entity, line: 14 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  2.  
  3. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseStartTag: misplaced <html> tag in Entity, line: 15 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  4.  
  5. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseStartTag: misplaced <head> tag in Entity, line: 16 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  6.  
  7. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: expecting ';' in Entity, line: 119 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  8.  
  9. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseStartTag: misplaced <body> tag in Entity, line: 165 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  10.  
  11. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Tag noindex invalid in Entity, line: 372 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  12.  
  13. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Unexpected end tag : label in Entity, line: 426 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  14.  
  15. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Unexpected end tag : label in Entity, line: 456 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  16.  
  17. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Unexpected end tag : label in Entity, line: 486 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  18.  
  19. Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Unexpected end tag : label in Entity, line: 516 in Z:\home\localhost\www\SiteParser\SearchContent.php on line 65
  20. array(1) { [0]=> string(6) "aktsii" }

Одну ссылку все -же он находит. array(1) { [0]=> string(6) "aktsii" }, Но что за куча ошибок и как их исправить?
(Добавление)
А хотя эти ошибки скорее всего из-за не валидного HTML. Ставлю @ и все норм.

Но как сделать что-бы найти все ссылки а не только первую?
2. LIME - 03 Мая, 2013 - 16:56:09 - перейти к сообщению
http://simplehtmldom[dot]sourceforge[dot]net/manual[dot]htm
(Добавление)
хотя если только ссылки надо найти я бы юзал регулярку
3. DeepVarvar - 03 Мая, 2013 - 16:59:30 - перейти к сообщению
Говнокодеры изобрели защиту контента от парсинга - надо просто писать невалидную разметку! Радость

Ладно, по делу - Тут придется валидировать ручками.
Не знаю, но первая мысль - собрать регуляркой в массив все валидные теги, остальные - для начала откинуть сразу.
В последующих версиях парсера, если это критично, пытаться исправить и включать в валидный результат.
4. andreizanik - 03 Мая, 2013 - 17:03:33 - перейти к сообщению
Решил проблему.
PHP:
скопировать код в буфер обмена
  1. $doc = new DOMDocument();
  2.         @$doc->loadHTML($this->content);
  3.         $urls = $doc->getElementsByTagName('a');
  4.         foreach ($urls as $url) {
  5.            $urlarray[] = $url -> getAttribute('href');
  6.         }
  7.  
  8.         return $urlarray;
  9.  


Зря только тему создавал, запаниковал не разобравшись.
5. DeepVarvar - 03 Мая, 2013 - 17:14:47 - перейти к сообщению
LIME пишет:
simplehtmldom

Стало интересно.. Скачал.. Смотрю..

Оттуда:
PHP:
скопировать код в буфер обмена
  1.     function xmltext()
  2.     {
  3.         $ret = $this->innertext();
  4.         $ret = str_ireplace('<![CDATA[', '', $ret);
  5.         $ret = str_replace(']]>', '', $ret);
  6.         return $ret;
  7.     }

Касячок, т.к. в одной строке innertext() может быть несколько блоков CDATA.
Хотя внутри $this->load() (загружаем строку с *ML-разметкой) они потихому бреют все CDATA:
PHP:
скопировать код в буфер обмена
  1. $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true);


И главное вопрос - а не споткнется ли это поделие на невалидной разметке?
6. LIME - 03 Мая, 2013 - 17:25:48 - перейти к сообщению
хз...народ говорит
Цитата:
Simple HTML DOM — отжирает огромное количество памяти при невалидном HTML. Долго думает, но парсит.
http://habrahabr[dot]ru/post/114143/
7. DeepVarvar - 03 Мая, 2013 - 18:27:29 - перейти к сообщению
LIME пишет:
отжирает огромное количество памяти
Правильно - судя по исходнику, на каждую ноду, в том числе и текстовую, он создает экземпляр себя самого.
8. LIME - 03 Мая, 2013 - 22:39:20 - перейти к сообщению
ты хочешь сказать что объектная модель документа строит дерево объектов?
это ужасно))
9. DeepVarvar - 03 Мая, 2013 - 22:59:12 - перейти к сообщению
Это ужасно не потому что это именно так, это ужасно потому,
что в классе огромное кол-во строк кода, и все это клонируется.

 

Powered by ExBB FM 1.0 RC1