Распечатка определенного содержимого с сайта в терминале
Это была одна из 12 проблем в моем практическом экзамене сегодня. Для первой части задачи мы должны были перечислить содержимое первой страницы с http://slashdot.org/. Я использовал рысь для этого. Затем, во второй части, нас попросили отфильтровать вывод таким образом, чтобы он перечислял только заголовки (названия статей) с первой страницы slashdot.org (эта буквально раздавила меня) . Имейте в виду, что это была задача из 12 на 100-минутном экзамене, поэтому я считаю, что есть быстрый способ сделать это, но мне не удалось найти заметных паттернов. Есть идеи, как это решить?
2 ответа
Вам нужны два компонента. Сначала вам нужно что-то, что может извлечь главную страницу slashdot (необработанный html), а затем что-то, что позволяет вам получать заголовки из этого.
Первый компонент может быть curl
или же wget
, Я неравнодушен к wget
:
wget -O slashdot.html http://slashdot.org/
Далее, посмотрите на slashdot.html с помощью текстового редактора. Вы найдете, что заголовки содержатся в тегах. Итак, второй компонент - это то, что достаточно хорошо понимает HTML, чтобы вы могли получить только теги h2. Вы можете сделать это с помощью некоторых умных регулярных выражений, используя grep, awk или sed, но вы сойдете с ума. Я предпочитаю что-то, что знает HTML немного лучше. Если вам разрешено устанавливать дополнительные пакеты, получите libxml2-utils
упаковка и использование xmllint
, Он может анализировать HTML (с ключом -html) и понимает нотацию xpath для выбора узла HTML/XML. Объяснение xpath выходит за рамки ответа здесь, и для вас было бы очень неплохо узнать больше, поэтому я предлагаю вам поискать "xpath" в Google, чтобы понять, как он работает.
Единственным дополнительным приемом является то, что xmllint будет печатать текст из узлов h2 дословно, поэтому он будет выглядеть уродливо, поскольку все они в одну строку. Я также буду использовать перенаправление и каналы, чтобы избежать создания временных файлов и отбрасывать вывод проверки hmml xmllint (html slashdot ужасно несовместим):
wget -q -O - http://slashdot.org | xmllint -html -xpath '//h2/span/a/text()' - 2>/dev/null
Вы заметите, что он показывает заголовки в одну строку. Теперь, чтобы разделить их, измените его на это (чтобы вставить \n
символ как часть текста заголовка, перед закрытием </a>
:
wget -q -O - http://slashdot.org | sed 's/<\/a>/\n<\/a>/g' | xmllint -html -xpath '//h2/span/a/text()' - 2>/dev/null
- Сначала создайте домашнюю страницу slashdot, выводя HTML-код на стандартный вывод (
-O -
) и подавление сообщений о прогрессе wget (-q
). - Труба это к седу, чтобы добавить
\n
после каждого закрытия</a>
тег. - Наконец, передайте это в xmllint (используйте
-
как входной файл для чтения из stdin), попросите его использовать html-анализатор и показать только узлы, соответствующие данному выражению xpath, отбрасывая любые диагностические выходные данные (2>/dev/null
отказаться от стандартной ошибки).
grep '<h.*>.*<\/h.>' sample.html | sed -e 's/<[^>]*>//g'
grep 'regex(все теги заголовка)' имя файла pipe(" | ") sed удаляет все теги html
Это должно работать.