Сбор информации в тегах HTML в unix с помощью curl and cut

Я хотел бы найти простейший способ захвата содержимого между тегами HTML / XML с удаленного ресурса в unix. Вот как я думал, что это сработает.

curl https://www.google.com | grep "<title>" | cut -d '<title>' -f2 | cut -d '</title>' -f1

Итак, сначала я curl ресурс, выделяю строку с тегом, который мне нужен (что иногда означает весь HTML, потому что в наши дни многие веб-сайты минимизированы).

Потом я вырезал все после открытия <title> и, наконец, я вырезал все после закрытия ''.

Однако это вызывает ошибку: curl: (23) Failed writing body (0 != 8192). Похоже, что ошибка возникает из-за того, что cut не поддерживает разделители, которые представляют собой какие-либо символы, кроме одного.

Мне понравилось, что мой подход был очень минималистичным способом получения данных, которые я хотел, и я ищу другой простой способ сделать это.


Кроме того, даже если бы это сработало, мое решение работало бы только для одного тега в HTML. А как насчет тега, который появляется много раз?


person Orun    schedule 19.08.2018    source источник
comment
Это можно было сделать с sed -n, но, как утверждали другие, вероятно, не рекомендуется анализировать html как простой текст. Для справки, подход sed будет выглядеть так: curl https://xkcd.com/ | grep "<title>" | sed -n "/<title>/,/<\/title>/p".   -  person Orun    schedule 19.08.2018


Ответы (2)


Этот набор инструментов от W3, кажется, подходит для вашего случая использования. http://www.w3.org/Tools/HTML-XML-utils/README

Для чего-то достаточно маленького вы можете обойтись чем-нибудь вроде этим. (Я бы использовал Python + lxml для чего-нибудь еще)

И помните: Вы не можете разобрать [X] HTML с помощью регулярного выражения.

person MGP    schedule 19.08.2018
comment
Это интересно, посмотрю hxextract, спасибо. Хотя, поскольку это, по сути, простая манипуляция с текстом, я чувствую, что это должно быть легко сделать с помощью собственных утилит unix. Тем более, что я мог бы использовать это в других веб-форматах, отличных от HTML, таких как json или даже обычный текст. - person Orun; 19.08.2018
comment
Для json вам следует проверить jq, замечательный маленький инструмент. - person MGP; 19.08.2018

Это, вероятно, было бы проще на другом языке, таком как py или php, но есть отличный инструмент, поставляемый пакетом html-xml-utils (также известен под другими именами.

Пример (ec2 linux AMI):

sudo rpm -ivh html-xml-utils-6.7-2.1.x86_64.rpm 
curl https://www.google.com | hxselect title
... ... ...
<title>Google</title>

Дополнительная информация: - https://www.w3.org/Tools/HTML-XML-utils/README

person Mike Q    schedule 19.08.2018
comment
У меня проблемы с использованием библиотеки с некоторыми примерами документов: кажется, что они всегда нарушают работу механизма синтаксического анализа. `` `` $ curl google.com | hxselect title Конечный тег ‹/head› не соответствует начальному тегу ‹meta› `` `` Я связался с главным сопровождающим, чтобы узнать, есть ли публичное репо для библиотеки, принимающей вклад / проблемы. - person Guillaume Berche; 13.10.2020
comment
@GuillaumeBerche до сих пор я решил эту проблему, пропустив hxclean (также hxnormalize -x) перед отправкой на hxselect - person Pablo Bianchi; 24.04.2021