Распечатка определенного содержимого с сайта в терминале

Это была одна из 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
  1. Сначала создайте домашнюю страницу slashdot, выводя HTML-код на стандартный вывод (-O -) и подавление сообщений о прогрессе wget (-q).
  2. Труба это к седу, чтобы добавить \n после каждого закрытия </a> тег.
  3. Наконец, передайте это в xmllint (используйте - как входной файл для чтения из stdin), попросите его использовать html-анализатор и показать только узлы, соответствующие данному выражению xpath, отбрасывая любые диагностические выходные данные (2>/dev/null отказаться от стандартной ошибки).
grep '<h.*>.*<\/h.>' sample.html | sed -e 's/<[^>]*>//g'

grep 'regex(все теги заголовка)' имя файла pipe(" | ") sed удаляет все теги html

Это должно работать.

Другие вопросы по тегам