Вы не можете проанализировать XML с помощью Regex. Давайте все равно сделаем это.
Эта сцена пришла ко мне во сне
Харухи говорит …
“Они даже не добрались до блога вещи1 И они уже делают противоречивое заявление. #1
Контент – это слово врага. Компании скажут «контент» вместо того, чтобы называть его произведениями искусства, писания, произведения и тому подобное, как будто все средства массовой информации – что -то взаимозаменяемое, предназначенное для заполнения коробки. Ссылка на «искусство» как «контент» в настоящее время часто является уничижительным. Если я когда -нибудь сделаю «CDN» (сеть доставки контента), я назову это SDN. Звучит намного удобнее.Должен быть какая -то запись! К счастью, это противоречие далеко от последнего в этом посте. “
Пытаясь проанализировать HTML с Регулярные выражения это печально известная ловушка и отличный пример использования неправильного инструмента для работы. Это общепринято, чтобы быть плохой идеей по множеству причин.

Изображение 1 – Он продолжает идти еще на 3 экрана (Ссылка на переполнение стека)
Есть этот знаменитый переполнение стека о том, почему вы должны Никогда, никогда Сделай это. На самом деле, этот ответ стал настолько популярен, что он использовался как Copypasta в некоторых кругах. Каждый раз, когда я наткнулся на это, я подумал, как есть много правды в нем – Но в то же время я не мог полностью согласиться …
Но … не так ли?

Изображение 2 – Знаете ли вы, что у XML есть логотип? Я не шучу, я тоже только узнал сегодня
Хотя я предполагаю, что у всех читателей этого блога есть хотя бы нечеткий Понимание XML, стоит напоминать ради более поздних аргументов. Цитируя Статья Википедии о XML:
Расширяемый язык разметки (XML) – это язык разметки и формат файлов для хранения, передачи и реконструкции данных. Он определяет набор правил для кодирования документов в формате, который как читается как человеко-читаемый, так и компьютерный.
Я хотел бы сосредоточиться на трех частях:
- Это язык разметки: в отличие от JSON или Томл3В #3
Это предложение первоначально упоминалось Yaml. Этот пост не о YAML, и все же я получил много жалоб на то, что подразумевает, что YAML можно считать простым. Это обсуждение имеет Абсолютно никакого отношения к этому поступоэтому я заменил его на Toml. Не люблю Toml? Подумайте об Ини. Не нравится INI? Подумайте о CSV и т. Д.XML определяет гораздо более конкретную структуру для документа. Другой SGML Деривативы немного более слабые с применением указанной структуры – помните этот факт на потом. - Это машино читаемо: Он предназначен для анализа и интерпретации в дерево.
- Это читается по человеку: Специализированные инструменты не требуются для посмотрите на и понимать Данные, содержащиеся в документе XML.
Чем нет Википедии немедленно передать (вы должны прокрутить вниз до раздела 11), что это то, что XML ужасно сложныйПолем JSON, TOML и многие другие читаемые на человеку форматы обмена данными достаточно просты, и многие разработчики самоучки изучают их с помощью осмоса. Черт, RFC8259, «Формат обмена данными javaScript объекта (JSON)»составляет 16 страниц, из которых фактическое описание формата занимает, может быть, 8. Напротив, база XML 1.0 (второе издание) Спецификация составляет 59 страниц, и это не включает в себя различные расширения, которые выросли с 2000 года. Неудивительно, что эта большая площадь поверхности становится обязательством безопасности Когда разработчики не знакомы со всем набором функций.
Это отсутствие углубленных знаний о формате заключается в том, почему новички даже рассматривают анализ XML с помощью корпорации. Это “Вы не знаете, чего не знаете«Проблема, которая приводит к совершенно другому подходу при написании анализатора.
Ваш анализатор ↓ мой анализатор
Давайте вернемся к «машиночитаемой» против «человеческой», читаемой на человеке; Предположим, что у нас есть анализатор на основе стека; Это позволяет легко проиллюстрировать, где находится анализатор в данной структуре. (Чтобы обновить, стек – это очередь/массив, где операции являются «толчками», которая добавляет значение к концу, и «POP», который удаляет и возвращает это значение в нашу программу.)
Рисунок 1 – Очень простое xml -подобное дерево объекта
Вот упрощенное представление о том, как парсер может «ходить» на дереве:
# stack=()
# push a; stack=(a)
# push b; stack=(a b)
# pop; stack=(a b)
# pop; stack=(a)
# pop; stack=()
Рисунок 2 – то же дерево, теперь поспешно аннотированное действиями и состоянием
Хотя приведенный выше пример не показывает ничего полезного с нашим деревом, на самом деле довольно просто включить систему запросов селекторов, подобного DOM, поверх этого. Следующий фрагмент реализует очень наивный XML-подобный анализатор, который можно использовать для извлечения строк из объектов:
#!/usr/bin/env bash
# Please don't actually use this. xoxo, dmi
stack=()
tokens=()
buf=
# QUERY=(a b c)
QUERY=($@)
flush() {
if [[ "$buf" ]]; then
tokens+=("$buf")
fi
buf=
}
search() {
(( ${#stack[@]} < ${#QUERY[@]} )) && return
[[ ${tokens[-1]} != "lbrack" ]] && return
for (( i=0; i<${#QUERY[@]}; i++ )); do
if [[ "${QUERY[i]}" != "${stack[-${#QUERY[@]}+i]}" ]]; then
return
fi
done
echo "query result: ${tokens[-2]}"
}
while read -rn1 chr; do
if [[ "$chr" == "<" ]]; then
flush
tokens+=("lbrack")
elif [[ "$chr" == ">" ]]; then
if [[ "${tokens[-1]}" == "lbrack" ]]; then
flush # get tag contents
stack+=("${tokens[-1]}") # put it onto the stack
elif [[ "${tokens[-1]}" == "slash" ]]; then
unset stack[${#stack[@]}-1] # pop last element
fi
tokens+=("rbrack")
elif [[ "$chr" == "/" && "${tokens[-1]}" == "lbrack" ]]; then
tokens+=("slash")
else
buf+="$chr"
fi
search
done
Рисунок 3 – Стоин для нашей разметки.
Я буду инвестировать в раскраску синтаксиса в следующем квартале
Результат:
## in DOM selector terms, 'a b c' would be 'a > b > c'
$ ./parse.sh a b c < test.xml
query result: meow
$ ./parse.sh a b d < test.xml
query result: nya
Рисунок 4 - демонстрация анализатора
Это «ходящее» поведение может быть визуализировано еще лучше после добавления Declare -p Stack на каждый цикл:
$ ./parse.sh a b d < test
declare -a stack=()
declare -a stack=()
declare -a stack=([0]="a")
declare -a stack=([0]="a")
declare -a stack=([0]="a")
# (...)
declare -a stack=([0]="a" [1]="b")
# (...)
declare -a stack=([0]="a" [1]="b" [2]="c")
declare -a stack=([0]="a" [1]="b" [2]="c")
declare -a stack=([0]="a" [1]="b" [2]="c")
# (...)
declare -a stack=([0]="a" [1]="b")
# (...)
declare -a stack=([0]="a" [1]="b" [2]="d")
declare -a stack=([0]="a" [1]="b" [2]="d")
declare -a stack=([0]="a" [1]="b" [2]="d")
declare -a stack=([0]="a" [1]="b" [2]="d")
query result: nya
declare -a stack=([0]="a" [1]="b" [2]="d")
declare -a stack=([0]="a" [1]="b" [2]="d")
declare -a stack=([0]="a" [1]="b" [2]="d")
declare -a stack=([0]="a" [1]="b")
# (...)
declare -a stack=([0]="a")
# (...)
declare -a stack=()
Рисунок 5 - стек в действии
Из-за однопроходного характера нашего анализатора (который объединяет токенизацию и несколько других шагов в один), мне пришлось удалить некоторое повторение. Кроме того, этот анализатор предназначен только для демонстрационных целей и не может анализировать произвольный XML. В реальном мире XML есть много специальных объектов, самостоятельных тегов и других GotChas, которые должны учитываться, даже во время простой извлечения текста.
Как Ваш мозг читает XML
Теперь, когда у вас есть суть о том, как может работать алгоритм для анализа XML (и, надеюсь, понимает, что написание анализатора - это большая боль), давайте отступим и рассмотрим, как мы, создания белка и плоти, Parse XML. Чтобы сделать вещи сложнее, давайте посмотрим на сырая, истинная форма XML - не допускается симпатичная печать.
Рисунок 6 - Пример от до начала, уплотненный
Для неподготовленного глаза, это не смотреть как дерево.
Рисунок 7 - Та же самая структура, с пробелом, расположенным для образования дерева X -Mas
Ах, намного лучше! Это Семантически эквивалентный ко всем фрагментам, которые я прикреплял раньше, но вы должны подумать очень сложно представить это a> b> (c, d)Полем Для меня этот фрагмент в первую очередь строкаПолем
Строка диапазона
Приближение XML или любого другого формата структурированных данных как строка это как мусорное ведро для запчастей. Я не имею в виду это плохо; и regex, и мусорный дайвинг наградили меня немного Отличный материалПолем Но они также дают мне желание принять душ сразу после этого.
Чтобы продолжить аналогию, вы не можете узнать о почему Что -то было выброшено (как и в том, почему присутствуют данные и почему они отформатированы так, как оно есть). Эта информация потеряна. Вы можете сделать образованные предположения, если вы смотрите на это достаточно долго, но вы не можете знать наверняка. Хуже того, если ваши данные изменяются (как это может произойти с XML, возвращенным API), все дерево может быть заказано немного по -другому, что делает ваш тщательно продуманный анализатор. По этому - и многим другим причинам - лучше всего разобрать XML с настоящим анализатором.
Я изучу реальные методы анализа строки позже в этом посте. До этого у нас есть слон в комнате для решения ...
HTML: XML, но Причудливый
Уголок педантичности
Некоторые могут утверждать, что как HTML, так и XML были получены из SGMLне друг от друга, поэтому этот заголовок раздела не имеет смысла.
В оппозиции я хотел бы утверждать, что, хотя XML вдохновляет страх как в майорах CS, так и в хакерах, практически никто не знает о SGML. HTML является Причудливый XML.
HTML является основным языком, используемым для презентации онлайн. Интернет жизни и дышит HTML. Вы можете делать веб -приложения без веб -сайта, без Ecmascript или даже без CSS. Но Вы абсолютно нуждаться2 HTML (... или xhtml - держите эту мысль).
#2
Перед публикацией Лиза утверждала, что вы технически может сделать страницы без HTML:
SVG, Java Applets, Flash, PDF
Можно дискредитировать последние три варианта, так как это внешние технологии, которые не являются частью какой -либо веб -спецификации. Тем не менее, SVG намного сложнее игнорировать. Это Рекомендация W3Cчто делает его хотя бы прилегающим. Это также указывает а ярлыктак технически SVG можно использовать «без HTML» для создания веб -страницы. Я остаюсь скептически.
Несколько тысяч байтов назад я коснулся того, как XML очень сильно строго в макете. HTML - это полная противоположность, позволяющая зарекомендовать себя и разбитую грамматику. Сандитор XML получит сердечный приступ, если его попросят анализировать HTML, найденный в Интернете.
Анализ HTML почти невозможна
Хорошо сформировано HTML в порядке. Тем не менее, браузеры предназначены для того, чтобы сделать образованные догадки, вместо того, чтобы не сработать, когда наценка не подходит. Это был компромисс, созданный для доступности. Сегодняшние Devtools облегчают отладку, но в начале 90 -х? Для этого практически не было никаких инструментов. Наличие анализаторов принимает слегка изуродованный вход, без сомнения, улучшенное принятие, когда HTML был новым.
К сожалению, это означает, что HTML уже два слоя, удаленных из XML. Режим Quirks в значительной степени основан на том, как все было реализовано IE и Netscape 30 лет назад. Режим соответствия стандартам несколько улучшает ситуацию, но он все равно будет принимать пропущенные закрывающие теги или цитаты.
Это, как говорится, практически все эти ситуации определяются стандартом, и современные браузеры реализуют его очень сильно близко. Почему это «почти невозможным» тогда? HTML живой стандарт Затмевает основание XML, длится более 1500 страниц! ... Хорошо, возможно, это немного несправедливо - на момент написания написания только 114 из этих страниц на самом деле имеют дело с анализом (спасибо за проверку, Линус!). Несмотря на это, это все еще более X2 длины стандарта XML, и этот рост по большей части Определение краев! Если вы не используете фактический браузер, есть вероятность, что ваше дерево DOM будет проанализировать немного по-разному на страницах, которые плохо сформированы.
Html4.01? Нелепый! Нам нужно разработать лучшую альтернативу, которая соответствует потребностям каждого
Ситуация: есть два стандарта брата.
Xhtml это ... странное существо. Впервые он был введен в конце 1998 года и переработан в стандарт, который был принят в качестве рекомендации W3C в январе 2000 года. К сожалению, он не был широко принят (в отличие от более позднего HTML5) ...
Попытка заставить мир переключиться на XML, включая кавычки вокруг значений атрибутов и ударов в пустых тегах и пространствах имен одновременно не сработала. Большая общественность, генерирующая HTML, не двигалась, в основном потому, что браузеры не жаловались. Некоторые крупные сообщества сдвигались и наслаждались плодами хорошо сформированных систем, но не все.
~ Тим Бернерс Ли2005
Я упоминаю только XHTML, потому что, техническиУ нас была строгая, четко определенная альтернатива HTML в течение почти 3 десятилетий, несмотря на то, что не многие люди знали об этом. Черт возьми, xhtml5 тоже существует! Вы можете использовать его прямо сейчас! Это действительно круто! (Famfo продолжает рассказывать мне об этом, так что это имеет быть правдой.)
Наконец: на самом деле анализ HTML с помощью Regex
Следующий раздел является полностью продуктом моих попыток очистить различные веб -страницы на протяжении многих лет. Я знаю, как сильно практика соскоба рассматривается в некоторых кругах, и я хотел бы заверить читателя, что боты, которые я построил в прошлом, всегда были медленно запросить, и использовал обширное кэширование. Genai Scraveers, постоянно дозируя интернет, могут попасть в ад.
Преимущества
Харухи говорит ...
"Спорим, что вы не ожидали, что они поговорит о преимущества После того, как они так долго разбирались в том, как тяжело анализировать HTML. Ха! "
- Скорость развития
- Адаптируемость
Современные веб -сайты часто имеют сотни, если не тысячи вложенных элементов. Написание выбора для чего -то Действительно В глубине души может занять некоторое время, особенно если присутствуют дополнительные ограничения (рандомизированные имена классов? Разработчик только знает о Div-S?).
Написание корпорации занимает у меня 30 секунд. Но взломать хороший селектор и отладки, почему он не работает по следующему запросу? Десятки минут проклятия.
Селекторы строгие. Они либо дают вам результат, либо терпят неудачу. Это большой Когда вы доверяете другой стороне системы, чтобы отправить вам хорошую, точную разметку. Тем не менее, это не то, что вы можете ожидать при скребке. Например:
(...)
This leaves us with the following payload:
scroll0" class="scrollable">
Рисунок 9 - слегка грязный, но, тем не менее, извлечен
Оставшаяся наценка HTML может быть удалена с помощью еще нескольких фильтров SED, но это не совсем точка зрения этого примера. Вместо этого представьте, что National Rail изменил свою разметку, чтобы прекратить использовать эти нелепые промежутки:
(...)
remiberry at 01.10.2025, 20:20:15
oh i was completely unaware of grep -P and the ".*?" matcher, guess it's time to actually read through grep's manpage
as always awesome co-, uh, stuff - thanks for the evening read domi :3c
nat at 02.10.2025, 00:01:07
xhtml5 mentioned, yippee!
By commenting, you agree for the session cookie to be stored on your device ;p
2025-10-05 01:58:00
1759637097
#Вы #не #можете #проанализировать #XML #помощью #Regex #Давайте #все #равно #сделаем #это
Читайте также