|
| Дата |
|
USD/RUB | 88.6852 | BTC/USD | 68599.9007 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
10.09.2010, 19:41
|
Start Post: Парсинг HTML- 3 подхода
|
Сеньор Член
Регистрация: 11.04.2007
Адрес: The World
Сообщений: 1,125
Бабло: $107796
|
Полная версия (с сорцами - в блоге)
Перед нашей братией часто возникает необходимость парсить html-страницы(тк добровольно контент посредством API/RSS/XML-данных отдают далекоо не все Захотелось написать мне эту статью потому, что многие даже не представляют что есть варианты парсинга кроме регулярок
1.Строковые функции
Использование функций strpos / substr (поиск нужного места — извлечение подстроки) . Самый быстрый вариант (в 8 раз быстрее регулярок по результатам некоторых тестов). Из недостатков — громоздкий код, решается написанием библиотечных функций, например, такую (skipped)
2.Регулярные выражения
Самый компактный способ записи желаемого ) И самый любимы у сеошников ) Из минусов — код быстро становится нечитаемым. Как-то раз приходилось сталкиваться с парсером мегапорносайта, в котором было регулярок на два листа ) Пришлось писать заново. По скорости этот вариант между строковыми функциями и Dom-деревом.
3.Разбор DOM-дерева
Самый медленный способ, но самый надежный. Если в предыдущих способах все обычно ломается от появления лишних кавычек или пробела в коде (или вписывания разработчиком нового аттрибута итп), то Dom-дерево будет парсится пока у нужного элемента не сменится name или id. Для всех популярных языков программирования как правило уже есть библиотеки разбора, вам остается лишь дописывать функции типа этой (skipped)
|
|
|
10.09.2010, 23:35
|
#12
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
Цитата:
Сообщение от Hector
регулярки юзаю) на скорость плевать
|
так это наоборот самый быстрый и простой в работе способ, "строковый" не в счет в виду его убогости
А с домом бывают траблы: то html ему не валидный, то кодировка не та, да и памяти он жрет немеряно, попробуйте прогрузить html размером в 20 мегабайт
Использую оба способа, но чаще dom-xpath, т.к. он более высоко уровня как бы
|
|
|
10.09.2010, 23:45
|
#13
|
Senior Member
Регистрация: 15.11.2008
Сообщений: 13,239
Бабло: $247847021
|
Цитата:
Использую оба способа, но чаще dom-xpath, т.к. он более высоко уровня как бы
|
а смысл?
|
|
|
11.09.2010, 00:41
|
#14
|
кодер
Регистрация: 21.01.2008
Сообщений: 315
Бабло: $69585
|
DOM деревья, по моему, тоже не всегда понятнее регулярок
а по скорости, особо без разницы, почти все время уходит на коннекты..
__________________
php скрипты от $25 Отзывы: 2013-2011, 2010, 2009. acя: 384 846 ноль два шесть
|
|
|
11.09.2010, 00:47
|
#15
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
Цитата:
Сообщение от imgreen
а смысл?
|
а мне так удобнее по дереву путешествовать, это я про случаи, когда не знаешь id элемента или нужны, например, все <p></p> внутри 5-ого <div> на странице - на xpath это одна строчка
Вообще xpath чем-то похож на регулярки - те же правила, только манипулируешь не на уровне символов, а на уровне объектов
|
|
|
11.09.2010, 04:06
|
#16
|
grablab.org
Регистрация: 18.09.2007
Адрес: Thailand
Сообщений: 4,893
Бабло: $322264
|
дом устойчив к изменениям страницы, двоечники. прочитать текст сложно?
|
|
|
11.09.2010, 04:18
|
#17
|
grablab.org
Регистрация: 18.09.2007
Адрес: Thailand
Сообщений: 4,893
Бабло: $322264
|
Цитата:
Сообщение от Hector
регулярки юзаю) на скорость плевать
|
ага в вебе не критично )
часто быстрее регулярочку написать чем выйоубываться. но например на питоне есть http://www.crummy.com/software/BeautifulSoup/ ваще улет )
бывает если сложная хрень и высока вероятность ошибок. выделяешь строковыми функциями область (обычно див уникальный или ебучее нагромождение сраного яваскрипта) там соупом парсишь элементы оттуда уже циферки регуляркой. хуево канешно наверное с точки зрения кода, но это обычно редко нужно.
|
|
|
11.09.2010, 15:17
|
#19
|
Member
Регистрация: 15.08.2010
Сообщений: 30
Бабло: $5180
|
В python для работы с HTML удобно использовать lxml:
* парсинг невалидного html (lxml.html модуль)
* поддержка Xpath
* ElementTree API
* много других вкусностей типа того же парсинга/заполнения форм
|
|
|
11.09.2010, 19:59
|
#20
|
Юниор
Регистрация: 16.08.2010
Сообщений: 11
Бабло: $4480
|
Цитата:
Сообщение от medar
|
Либа классная. Только у php с сбором мусора плохо. Где-то на тысяче файлов он у меня отжирал 2 гига ram и ниче не помогало.
А по теме - пара своих функций в которые завернуты текстовые функции и regexp. Написал на php и на python, чтобы все единообразно было.
|
|
|
16.09.2010, 23:46
|
#21
|
Сеньор Член
Регистрация: 11.04.2007
Адрес: The World
Сообщений: 1,125
Бабло: $107796
ТС -->
|
ТС
Цитата:
Сообщение от chesser
так это наоборот самый быстрый и простой в работе способ, "строковый" не в счет в виду его убогости
А с домом бывают траблы: то html ему не валидный, то кодировка не та, да и памяти он жрет немеряно, попробуйте прогрузить html размером в 20 мегабайт
Использую оба способа, но чаще dom-xpath, т.к. он более высоко уровня как бы
|
для Джавы многие дом-парсеры умеют фиксить ошибки в хтмл. для других языков тоже самое думаю.
со строками функциями обычно можно обойтись получается вполне компактно и понятно, типа
PHP код:
redirUrl = helper.parseFirst(code,"src=\"","\" ");
|
|
|
|