Для распарсивания html использую libxml2. В общем устраивает, но хочется что-нибудь побыстрее.
Смотрел некоторые опенсорсные поисковики (Xapian, Dataparksearch) — у них свои собственные парсеры. Разбираться с их исходниками и адаптировать под свои нужды — еще не созрел, хотя уже близко к тому.
Не знает ли кто другие открытые парсеры, более легкие и шустрые, чем libxml2? Мне ни Гугл, ни Яндекс помочь не смогли. Возможно не так спрашивал.
Почему бы не воспользоваться регулярными выражениями, если нужно всего лишь вытащить куски страницы? Получение заголовка — /(\w+)<\/title>/gi, сбор ссылок — что-то типа /<a[^>]*href="([^>"]*)"[^>]*>(\w+)<\/a>/gi (правда, эта регулярка не работает, если в тексте ссылки есть еще теги). Посидеть, поломать мозг над ними… и наверное, заработает.
Редко, но встречаются варианты, когда имена тэгов пишут большими буквами. Чтобы работало на всем множестве исходных данных, регулярное выражение получится довольно громоздким. Боюсь в таком виде оно будет не особо шустрее того-же libxml. libxml купил определенной универсальностью — он глотает почти все. Чтобы самостоятельно добиться похожего результата, надо сильно попотеть. А мне «горячих» задач и без этого хватает.
Модификатор i позволяет игнорировать регистр букв, так что большие буквы в тегах — не проблема. А на счет скорости работы ничего сказать не могу, увы =(
Быстрее чем если писать парсер заточенный под конкретную цель самостоятельно вряд ли выйдет.
У Вас какая-то очень специфическая и сложная задача, что вы используете libxml? Может конечно это у меня руки кривые, но сколько не пытался им парсить сложные XML, каждый раз понимал, что ручками и быстрее и надежней:)
Как минимум нужно выделить из html-страницы заголовок, description, кодировку и собственно текст.
В тексте желательно отфильтровать различные лево-правые столбцы с ссылками-меню и т.п.
Как отдельная подзадача (была у коллеги, но чую, достанется по наследстве мне) — сбор всех ссылок со страницы в виде (url, текст). Могут прорезаться и другие требования. Поэтому и подсел на libxml — он строит дерево, оббегая которое можно получить все, что требуется.
Ну зачем же сайты то ломать, карму себе портить :)
На один сайт, точнее даже, на один IP открывается один поток. Так что с сайта в единицу времени берется не более одной страницы. Это конечно медленный путь получения информации, но лучше медленно, чем тебя везде банить начнут.
мысль в том, что если вы достаточно медленно опрашиваете сайты, то и производительности любого скриптового языка должно вполне хватать. так что и данная библиотека не слишком плоха. да и вообще, можно выбирать парсер с точки зрения удобства прежде всего.
phpquery обладает большим функционалом но не совсем то по скорости. Лучше приводить HTML в XML и обрабатывать при помощи XSLT. Скорость работы думаю вполне удовлетворит.
«Mechanize is the seventh studio album by Fear Factory.» ;) en.wikipedia.org/wiki/Mechanize
==============================================================
Эта библиотека для несколько других целей разработана.
«The Mechanize library is used for automating interaction with websites.» mechanize.rubyforge.org/mechanize/README_rdoc.html
Там есть классы по распарсиванию страницы, но насколько они удобны именно для парсинга — надо разбираться.