LINUX.ORG.RU

В продолжение темы о парсинге HTML regexp'ами.


1

1

Недавно была уже тема где разгорелся спор на тему стоит ли парсить HTML regexp'ами:

preg_match_all выражение (комментарий)

Лично я отписался что зачастую использовать regexp удобнее чем сторонние библиотеки содержащие код сомнительного качества и пожирающие неизвестное количество памяти и также других ресурсов.

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

В настоящее время пишу скрипт который собирает данные из HTML и сохраняет их в DB. Прислушался к совету снобов из предыдущей темы и решил воспользоваться этим: http://simplehtmldom.sourceforge.net/manual.htm

В итоге через некоторое время после запуска скрипта я получаю сообщение:

zend_mm_heap corrupted

В настоящее время занимаюсь тем что переписываю скрипт с regexp'ами. Потому что это проще чем объяснять заказчику дополнительные параметры конфигурации которые ещё невсегда помогают, потому что я потрачу меньше времени за те же деньги, потому что я практик а не сноб-теоретик, и потому что мне глубоко наплевать на ваш снобизм.

PS. Знаю что PHP унылое говно. Но такого ТЗ.


regexp
пожирающие неизвестное количество памяти и также других ресурсов

anonymous
()

В итоге через некоторое время после запуска скрипта я получаю сообщение:

Память кончилась. simplehtmldom возвращает рекурсивные структуры, так что их плохо обрабатывает штатный сборщик. Там надо руками unset'ить.

http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak

i-rinat ★★★★★
()

Так взял бы sax парсер, если такие большие документы приходиться пережовывать.

anonymous
()
Ответ на: комментарий от i-rinat

Память кончилась. simplehtmldom возвращает рекурсивные структуры, так что их плохо обрабатывает штатный сборщик. Там надо руками unset'ить.

Вот, вот. Regexp не засирает память непонятно чем. Ну а то что PHP говно и так понятно.

tyler19
() автор топика

чем сторонние библиотеки содержащие код сомнительного качества и пожирающие неизвестное количество памяти и также других ресурсов.

Открой для себя удивительный мир SAX-парсеров. Ты даже можешь написать свой!

потому что я практик а не сноб-теоретик, и потому что мне глубоко наплевать на ваш снобизм.

В данном случае ты - ССЗБ.

// А DOM не нужен. Хотя иногда удобен для дебага.

schizoid ★★★
()

не вижу пробелмы - html для вытягивания текста парсится простой state machine , режекспы не осилят рекурсию, а тот проект что ты заюзал - маразм как и любой dom парсер.

Deleted
()
Ответ на: комментарий от schizoid

дом удобен для манипуляции документом, т.е. например в браузере или какомнить офисном редакторе.

Deleted
()
Ответ на: комментарий от tyler19

Вот, вот. Regexp не засирает память непонятно чем.

Кто же виноват, что ты не осилил одну страницу документации и одну страницу FAQ?

Ну а то что PHP говно и так понятно.

Все вокруг виноваты, да.

i-rinat ★★★★★
()
Ответ на: комментарий от Deleted

дом удобен для манипуляции документом, т.е. например в браузере или какомнить офисном редакторе.

То есть, там, где он уже загружен и выгрузить его нельзя. Тут не спорю, удобнее.

Но ТСу жалко памяти и ему больше SAX подойдёт, который не грузит дерево целиком.

schizoid ★★★
()
Ответ на: комментарий от i-rinat

Кто же виноват, что ты не осилил одну страницу документации и одну страницу FAQ? Все вокруг виноваты, да.

Виноваты быдлокодеры создавшие PHP неспособный переварить валидный код и которые не способны пофиксить баг уже несколько лет. Виноваты и разработчики этой библиотеки т.к. запихали упоминание об этом $html->clear() куда то в недра документации вместо того что бы включить эту строчку кода в каждый пример и пометить комментарием что она необходима. Виноваты все кто халатно относится к надёжности кода, а также те кто использует херову тучу рекурсивный объектов вместо элементарного regexp'а.

tyler19
() автор топика
Ответ на: комментарий от tyler19

Кстати вы тут можете ещё побурлить говнами своего теоретического снобизма, а я уже закончил всё с regexp'ами и положил деньги в карман. Удачи в дальнейших теоретических выкладках, а я больше в ваши XML парсеры ни ногой. Regexp в миллионы раз удобнее и не засирает память херовой тучей рекурсивных объектов.

tyler19
() автор топика

Если задача решается регэкспами, естественно надо её решать регэкспами. HTML в большинстве случаев можно рассматривать как текст, а лучшего DSL для работы с текстом чем регэкспы ещё не придумали. Главное понимать ограничения регэкспов, чтобы не начать решать задачу, ими не решаемую.

Legioner ★★★★★
()
Ответ на: комментарий от Karapuz

Меня вырвало. Такого и дешего пишется как «таково» и «дешево»

Вот и расскажите об этом на уроке правописания. А тут совершенно не в тему.

tyler19
() автор топика

мне глубоко наплевать на ваш снобизм
существование этой темы

Вот и расскажите об этом на уроке правописания. А тут совершенно не в тему.

быдлокодеры создавшие PHP

Молодой человек, а в каком вы классе?

Deleted
()

«Я три дня и три ночи скакала за вами, чтобы сказать, что вы мне безразличны».

Miguel ★★★★★
()
Ответ на: комментарий от tyler19

а я уже закончил всё с regexp'ами и положил деньги в карман.

Ты это, убегай подальше, а то ведь если тебя найдут когда всё внезапно сломается, то может не понравиться.

Deleted
()

что-то лор скатывается, что за темы пошли, что за люди, эх...

trashymichael ★★★
()
Ответ на: комментарий от anonymous

пожирающие неизвестное количество памяти и также других ресурсов

Ну если взять RE2, то количество памяти будет известным:)

anonymous
()

ТС, у тебя шизофрения.

resurtm ★★★
()

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

Без всякого снобизма. Много лет парсил html регекспами. Начинал ещё на Perl, продолжал на PHP. Сейчас вспоминаю тот парсинг как страшный сон. DOM реально рулит :)

В итоге через некоторое время после запуска скрипта я получаю сообщение:
zend_mm_heap corrupted

PHP-демон, что ли? Или как? А то на одиночных скриптах я далеко не один машиногод разбираю разные html через DOM, но с такой ошибкой не сталкивался.

Если демон, то на PHP каждую задачу нужно делать только форком. Чтобы память после окончания работы высвобождалась.

KRoN73 ★★★★★
()

мне глубоко наплевать на ваш снобизм

Кстати, после прочтения темы очевиден, как раз, высочайший уровень именно твоего снобизма :)

KRoN73 ★★★★★
()

у ТС бугурт от неосиляторства элементарных вещей.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от linuxnewb

Только если нужен именно DOM ;)

Если требуется извлекать данные из HTML не самого строгого или часто меняющегося формата.

Понятно, что один раз выдернуть цифру из строго фиксированного документа — тут регексп рулит. Но на практике это редкая ситуация. Парсинг обычно подразумевает массу неоднозначностей. И вот тут, реально, после нормальной работы с DOM от десятков прибитых костылями регекспов начинает становиться плохо :)

У самого ещё много такого legacy:

        if(preg_match('!<a href="/level/\d+/film/'.$film_id.'/" class="continue"[^>]+>\s+<span>([\d\.]+)</span>!si', $page, $m))
            $data['рейтинг'] = floatVal($m[1]);
        elseif(preg_match('!<div class="div1"><a href=".+?" class="continue" style="background: url.+?; text-decoration: none">([\d\.]+)<span style=!si', $page, $m))
            $data['рейтинг'] = $m[1];
        elseif(preg_match('!<div style="color: #f60;.*?class="continue".*?xt-decoration: none">([\d\.]+)<span!si', $page, $m))
            $data['рейтинг'] = $m[1];
        elseif(preg_match('!<span>([\d\.]+)</span><span style="font:100 14px tahoma, verdana" itemprop="ratingCount">!si', $page, $m))
            $data['рейтинг'] = $m[1];

Писец, если приходится работать с таким год спустя…

KRoN73 ★★★★★
()
Ответ на: комментарий от tyler19

$html->clear()

Ой, а что еще будет, когда ты ознакомишься с С

goingUp ★★★★★
()

То есть ты сначала не осилил сделать по-человечески, и затем решил сделать через жопу? Ага...

Deleted
()
Ответ на: комментарий от tyler19

прежде, чем бурлить фразами о «теоритических выкладках» узнал бы сколько денег уже положили в карман «теоретики». То, что ты заработал какую-то деньгу, поверь никого не волнует.

qnikst ★★★★★
()
Ответ на: комментарий от KRoN73

Так и есть, это все понятно,это именно тот случай, когда DOM нужен. Единственное, к чему при желании я бы придрался — количественная оценка соотношения обоих вариантов т.к. это сильно зависит. Ну да не в этом суть.

Вопрос в [не]корректности исходной формулы «парсить HTML», из которой нужность DOM-а никак не следует. Собственно, как и ненужность. ТС же, походу, этого так и не понял.

linuxnewb
()
Ответ на: комментарий от anonymous

да не бывают некоторые весёлые вендоры таким образом свою свои данные выдают, с парой гигов я, конечно, преувеличил, но данных реально достаточно, чтобы дом в память не поместился. И да это суровые европейские программисты.

qnikst ★★★★★
()
Ответ на: комментарий от KRoN73

Без всякого снобизма. Много лет парсил html регекспами. Начинал ещё на Perl, продолжал на PHP. Сейчас вспоминаю тот парсинг как страшный сон. DOM реально рулит :)

Иногда встречается такой html, что его только регэкспами и парсить. Как-то пришлось парсить специфический сайтик, написанный в начале 2000-х - он не то что не валиден, он абсурден по структуре, в нём отсутствуют какие-либо классы и id, и используются сотни вложенных таблиц. Причем на разных страницах разные способы вёрстки в одинаковых местах.

Прикинув, как придётся заморачиваться с DOM-парсером, было решено взять 10 в меру длинных регэкспов и сделать с их помощью.

anonymous
()
Ответ на: комментарий от anonymous

Прикинув, как придётся заморачиваться с DOM-парсером, было решено взять 10 в меру длинных регэкспов и сделать с их помощью.

Я такое обычно TagSoup-ом сначала причёсываю.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Я такое обычно TagSoup-ом сначала причёсываю.

Там кроме кривых тэгов и неправильной вёрстки (типа большой таблицы внутри span-а) ещё проблема с выделением нужного тэга. Проще было посчитать количество пробелов после тэга и составить регэксп с ними, чем пытаться разобраться в пяти вложенных таблицах, которые не имеют ни id, ни классов, ни вообще чего-либо.

anonymous
()
Ответ на: комментарий от Deleted

Ты это, убегай подальше, а то ведь если тебя найдут когда всё внезапно сломается, то может не понравиться.

$html->find('#id', 0)->plaintext будет работать до тех пор пока не поменяют id, точно так же как и preg_match('#<[^>]*id=«id»[^>]*>#Duis', ...). В случае обширных изменений в дизайне источника переделка потребуется в любом случае. Потребуется она или нет при небольшом изменении - вопрос везения. На все вылитые говна отвечать нет ни времени ни желания. Считайте меня кем хотите, фанатичные снобы.

tyler19
() автор топика
Ответ на: комментарий от tyler19

На все вылитые говна отвечать нет ни времени ни желания. Считайте меня кем хотите, фанатичные снобы.

Эталон.

i-rinat ★★★★★
()
Ответ на: комментарий от tyler19

У тебя настолько нет времени, что ты всё ещё пишешь в этом треде :3

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.