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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проблемы с DOMDocument

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
andreizanik
Отправлено: 03 Мая, 2013 - 16:49:06
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




Здравствуйте. Для обработки 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. Ставлю @ и все норм.

Но как сделать что-бы найти все ссылки а не только первую?

(Отредактировано автором: 03 Мая, 2013 - 17:06:14)

 
 Top
LIME
Отправлено: 03 Мая, 2013 - 16:56:09
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




http://simplehtmldom[dot]sourceforge[dot]net/manual[dot]htm
(Добавление)
хотя если только ссылки надо найти я бы юзал регулярку
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Мая, 2013 - 16:59:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Говнокодеры изобрели защиту контента от парсинга - надо просто писать невалидную разметку! Радость

Ладно, по делу - Тут придется валидировать ручками.
Не знаю, но первая мысль - собрать регуляркой в массив все валидные теги, остальные - для начала откинуть сразу.
В последующих версиях парсера, если это критично, пытаться исправить и включать в валидный результат.
 
 Top
andreizanik
Отправлено: 03 Мая, 2013 - 17:03:33
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




Решил проблему.
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.  


Зря только тему создавал, запаниковал не разобравшись.
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Мая, 2013 - 17:14:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




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);


И главное вопрос - а не споткнется ли это поделие на невалидной разметке?
 
 Top
LIME
Отправлено: 03 Мая, 2013 - 17:25:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




хз...народ говорит
Цитата:
Simple HTML DOM — отжирает огромное количество памяти при невалидном HTML. Долго думает, но парсит.
http://habrahabr[dot]ru/post/114143/
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Мая, 2013 - 18:27:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




LIME пишет:
отжирает огромное количество памяти
Правильно - судя по исходнику, на каждую ноду, в том числе и текстовую, он создает экземпляр себя самого.
 
 Top
LIME
Отправлено: 03 Мая, 2013 - 22:39:20
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




ты хочешь сказать что объектная модель документа строит дерево объектов?
это ужасно))
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Мая, 2013 - 22:59:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Это ужасно не потому что это именно так, это ужасно потому,
что в классе огромное кол-во строк кода, и все это клонируется.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« XML и его обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB