• Записи 162
  • Теги 66
  • Комментарии 334

Компьютерное

Особенности работы с HTML в PHP 8.4

В версиях PHP до 8.4 для выборочной очистки HTML использовался класс DOMDocument, который изначально был предназначен для работы с XML. Однако в версии 8.4 его использование приводит к тому, что возвращается пустая строка. Стал искать решение, и выяснилось, что с этой версии именно для HTML появился новый класс: Dom\HTMLDocument, а для выборки с помощью XPath вместе с ним теперь следует использовать Dom\XPath.

В итоге код для обработки HTML приобретает примерно такой вид:

[php]

5 комментариев:

4X_Pro
0

Ещё одна особенность выявилась: для Dom\XPath не работает поиск по имени тега, если импорт документа делать без опции Dom\HTML_NO_DEFAULT_NS.
Т.е. нужно примерно так: <?php
          $dom 
Dom\HTMLDocument::createFromString($html,Dom\HTML_NO_DEFAULT_NS);
          
$xpath = new Dom\XPath($dom);
          
$og_title $xpath->query('//meta[@property="og:title"]');

Нет
Гость
0

Почему SiteKnockerBot больше не работает?

4X_Pro
0

Сейчас посмотрел — работает, мои сайты последний раз проверялись 15.05 03:07:18. Правда, в последнее время много ложных срабатываний. Возможно, попробую переписать на Python + aiohttp проверяющую часть.

Нет
Гость
0

У меня сегодня почему-то на этот сайт ложное срабатывание возникло. Якобы он не отвечает.

4X_Pro
0

Если ошибка содержит «Client.Timeout exceeded while awaiting headers», то это — то самое ложное срабатывание. Там бывает так: первые несколько дней (или даже недель после перехода на FreeBSD) бот работает нормально, а потом начинает иногда выдавать такие ошибки. Долгое время считал, что из-за большого количества исходящих соединений в ядре OS заканчиваются какие-то ресурсы, но недавно возникла версия, что проблема в Go, а не в ядре. Предполагал, что таймаут возникает из-за срабатывания garbage collection в неудачный момент. Поставил принудительный вызов gc в конце проверочного цикла, но не помогло. Вот хочу на Pyhton переписать, посмотреть, останется ли проблема.
Когда-то проверочная часть тоже была на PHP, и ошибочных срабатываний было меньше (но всё равно наблюдались), но там проблема в отсутствии параллельности проверок. Точнее, я использовал curl_multi_exec, но это не совсем то, что нужно: общее время выполнения каждого пакета проверок всё равно определяется самым длинным запросом.

Написать комментарий


Задать вопрос