Необходимо извлечь число из HTML

Непосредственно:

who | head -2
who | tail -2
2
03.03.2017, 14:06
4 ответа

Использование curl для получения, lynx для разбора и awk для извлечения

Пожалуйста, не разбирайте XML/HTML с помощью sed, grep и т.д. HTML является контекстно-свободным, а sed и друзья - только регулярными. 1

url='https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=02/05/2017'
user_agent= 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'

curl -sA "${user_agent}" "${url}"  \
| lynx -stdin -dump                \
| awk '/1 EUR/{ print $4 }'

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

Здесь curl извлекает страницу, затем lynx разбирает ее и выводит текстовое представление. /1 EUR/ заставляет awk искать строку 1 EUR, находя только строку:

   1 EUR = 1.079992 USD

Затем { print $4 } заставляет его вывести четвертый столбец, 1.079992.

Альтернативное решение без curl

Поскольку мой парсер HTML - lynx, curl не нужен:

url='https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=02/05/2017'
user_agent= 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'

lynx -useragent="${user_agent}" -dump "${url}"  \
| awk '/1 EUR/{ print $4 }'

1 А pcre (grep -P в некоторых реализациях) может описать некоторые контекстно-свободные или даже контекстно-зависимые наборы строк, но не все.


Отредактировано 2017-12-23 для добавления строки user-agent (притворяется Firefox), поскольку сайт в настоящее время блокирует curl и lynx.

1
27.01.2020, 22:19

Другое решение: html2text

curl -s 'https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html/?fromCurr=USD&toCurr=EUR&fee=0&exchangedate=2/12/2017' \
| html2text \
| grep '1 Euro' \
| awk '{ print $4 }'
1
27.01.2020, 22:19

Предложение: используйте инструменты, поддерживающие xml / html:

xmllint

curl "$url" | xmllint -html -xpath '//span/strong[2]/text()' - 

xidel

curl "$url" | xidel -s -e "//span/strong[2]" -

или даже

xidel -e "/span/strong[2]" $url
0
27.01.2020, 22:19

Направьте вывод curl на следующую команду grep:

grep --color -Po '(?<=<strong>1 EUR = )\d+\.\d+(?= USD</strong>)'
0
27.01.2020, 22:19

Теги

Похожие вопросы