Это было одной из этих 12 проблем на моем практическом экзамене сегодня. Для первой части задачи мы, как предполагалось, перечисляли содержание первой страницы из http://slashdot.org. Я использовал рысь для этого. Затем для второй части нас попросили отфильтровать вывод таким способом только перечислить заголовки (названия статьи) от первой страницы slashdot.org (этот буквально сокрушил меня). Примите во внимание, что это было задачей из 12 на 100-минутном экзамене, таким образом, я считаю, что существует быстрый способ сделать это, но мне не могло удаться найти различимый patteren. Какие-либо идеи о том, как решить это?
grep '<h.*>.*<\/h.>' sample.html | sed -e 's/<[^>]*>//g'
grep 'regex (все теги заголовка)' канал имени файла (" |") sed удаляют все теги HTML
, Это должно работать.
Вам нужны два компонента. Сначала Вам нужно что-то, что может выбрать 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 выходит за рамки ответа здесь, и оно сделало бы очень хорошую тему исследования для Вас для узнавания больше, таким образом, я предлагаю, чтобы Вы Google "xpath" поняли, как оно работает.
О единственном дополнительном приеме то, что xmllint распечатает текст от h2 узлов дословно, таким образом, это будет выглядеть ужасным, поскольку они - все в одной строке. Я буду также использовать перенаправление и каналы, чтобы не создавать временные файлы, и отбросить вывод проверки HTML xmllint (slashdot HTML ужасно несовместимо):
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
-O -
), и подавляя wget сообщения о ходе выполнения (-q
). \n
после каждого закрытия </a>
тег. -
как входной файл для чтения из stdin) попросите, чтобы он использовал синтаксический анализатор HTML и показал только узлы, соответствующие данному выражению XPath, отбросив любой диагностический вывод (2>/dev/null
для отбрасывания стандартной погрешности).