HTML Parser

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Gin, 28 Sep 2010.

  1. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    Подскажите пжл хороший парсер который может понимать не валидный html. Пытался использовать Tinyxml и родной xml парсер Builder'а (TXmlDocument), но они "спотыкаются" на не валидном html. Мне нужно простое решние т.е. каких-нить гигантов типа Xerces не предлагать. Вообще суть данного парсера для того чтобы грабить input'ы для формирования post запроса. Пробовал для этих целей TRegExpr, для этих целей но он не подошел (при использовании в многпоточном режиме raise Exception). Также важно чтоб был thread-safe.
     
  2. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    использую этот класс в многопоточных программах целый год, ни разу не было проблем с этим
     
  3. NemeZz

    NemeZz Elder - Старейшина

    Joined:
    20 Aug 2008
    Messages:
    102
    Likes Received:
    67
    Reputations:
    3
    Компонент по регуляркам отлично пашет в потоках. Главное его там создавать, юзать и удалять.
    в чем проблема с первыми? Сделай поиск на </html>, если найдено - скармилвай парсерам, если нет - перекачивай
     
  4. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    В проекте использовалось достаточно много раз рекулярки и при наличии нескольких потоков выдает ошибку что выполнены ф-йия execnext перед ф-цией exec, что в принципе быть не может (просматривал код по нескольку раз). Поэтому решил что синтаксический анализатор будет лучше.
    ЗЫ
    Щас я что-то датый вообщем надо бы еще разок код пересмотреть, но вопрос остается открытым, парсинг HTML альтернативы регуляркам, два требования работа с невалидым HTML и thread-safe
     
  5. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Гыгы, лол
    Поток А выполнил Exec, переключился контекст, поток Б заного выполнил Exec и сразу ExecNext, переключился контекст, поток А пытается выполнить свой ExecNext а тут облом, ибо регулярка сброшена.
    Ты либо в крит. секцию оборачивай, либо создавай локальные копии TRegExpr для каждого потока, но так дела не делаются.
    Еще хорошо что класс генерит эксепшн, тебе сразу давая понять что ты что-то неправильно делаешь, а иначе была бы у тебя каша малаша, поток А работал с результатами для потока Б, и наоборот, и ты бы думал ах почему ничего не работает или работает криво
    Ну и да, автор компонента как всегда виноват
    Парсинг html - ресурсоемкая задача, а вот TRegExpr работает достаточно шустро.
    Что так трудно прицепить критическую секцию?
     
  6. Gin

    Gin Elder - Старейшина

    Joined:
    11 Sep 2008
    Messages:
    133
    Likes Received:
    7
    Reputations:
    4
    Мен я же не совсем баран (во всяком случае хочется в это верить) у меня создан отдельный класс в котором и реализуется все операции с парсингом (с помощью TRegExpr) внутри каждого потока создается экземпляр класса. Я думал этого вполне достаточно чтобы не заключать ф-ции для работы с данными в критические секции т.к. это не общие данные, а данные потока. Если я ошибаюсь, буду рад услышать твои рекомендации.
     
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Код создания и объявления нужен чтобы на 100% тебе сказать ответ
    А по этим симптомам пока все указывает на то что я написал выше
    Возможно что ты где-то накосячил и объект класса регулярки у тебя оказался расшаренным между тредами

    ЗЫ В соседней твоей теме тоже все указывает на это
     
  8. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Если нужно спарсить конкретные данные со страницы, то с помощью стандартных функций для работы со строками будет быстрее работать, чем с помощью TRegExpr.
     
  9. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    причем здесь стандартные функции если человек ищет парсер HTML
    Я говорю про что целиком парсить с помощью парсеров ресурсоемко