Как извлечь содержимое конкретного тега HTML после совпадения? - PullRequest
0 голосов
/ 11 июля 2019

Мне интересно, как я могу извлечь содержимое гиперссылки в HTML,

Например:

<article id="post36">
                <div>
                    <h3><a href="/blog/2019/4-14-canaries-in-the-coal-mine.html">Canaries in the Coal Mine</a></h3>
                    <p class="author">Posted by <a href="/blog/authors/moderator.html" rel="author">Moderator</a></p>
                    <p><time><span>Sunday, April 14th, 2019</span> &mdash; 8:17AM</time></p>
                </div>

Другие сообщения выглядят так (без внешней страницы):

<article id="post33">
                <div>
                    <h3><a href="#post33">Landlines Win Again</a></h3>
                    <p class="author">Posted by <a href="/blog/authors/moderator.html" rel="author">Moderator</a></p>
                    <p><time><span>Friday, December 21st, 2018</span> &mdash; 7:14AM</time></p>

Во внешнем скрипте мне передается идентификатор конкретного сообщения. В этом случае пост 36 ниже. У меня есть страница, содержащая все метаданные поста в тегах статьи, как показано ниже.

Я попытался использовать catting веб-страницу (у меня есть локальная копия) и передать ее по номеру sed -n 's|[^<]*<article\([^<]*\)</article>[^<]*|\1\n|gp'

Такого рода работы. Он возвращает только все идентификаторы статей, например:

<article id="post6">
<article id="post5">
<article id="post4">
<article id="post3">
<article id="post2">
<article id="post1">

Мой вывод таков: он работает только на текущей строке. И когда я пытаюсь на самом деле использовать идентификатор, я ничего не получаю: sed -n 's|[^<]*<article id="post36">\([^<]*\)</article>[^<]*|\1\n|gp'

Мой вопрос здесь заключается в том, как использовать встроенные инструменты Unix (sed, grep, awk и т. Д.) Для извлечения гиперссылки? В этом случае мне нужно /blog/2019/4-14-canaries-in-the-coal-mine.html

Да, я проконсультировался с несколькими сообщениями SO, такими как , этот и , этот , большинство из которых не одобряют подобные вещи (я пробовал собственные решения, но ни один не работал) , Две вещи:

  1. HTML форматируется красиво. В коде никогда не будет лишних пробелов, возврата каретки или чего-либо еще. Блоки всегда будут выглядеть так. Это очень специфическое приложение.
  2. Если на самом деле невозможно сделать это без какого-либо добавления или внешней программы, я бы хотел придерживаться базовых инструментов Unix.

1 Ответ

1 голос
/ 11 июля 2019

Вы можете выделить интересную строку с помощью sed адресов .В этом случае шаблон регулярного выражения для соответствия <a href

sed -nre '/h3.*href.*(#post[0-9]+|\/blog\/)/ s/.*<a href="([^"]+)".*/\1/p' test.html 
/blog/2019/4-14-canaries-in-the-coal-mine.html
#post33

Чтобы соответствовать идентификатору статьи, добавьте его перед командой sed

grep -A3 'article id="post36"' test.html | sed -nre '/h3.*href.*(#post[0-9]+|\/blog\/)/ s/.*<a href="([^"]+)".*/\1/p'
...